Author: violetagg Date: Wed Jul 10 18:53:50 2013 New Revision: 1501910 URL: http://svn.apache.org/r1501910 Log: javax.el.ArrayELResolver: According to javadoc: 1. getFeatureDescriptors - always returns null 2. isReadOnly - when property cannot be coerced into an integer it is ignored by the resolver. 3. getType - when property cannot be coerced into an integer it is ignored by the resolver. Unit tests are added
Added: tomcat/trunk/test/javax/el/TestArrayELResolver.java (with props) Modified: tomcat/trunk/java/javax/el/ArrayELResolver.java Modified: tomcat/trunk/java/javax/el/ArrayELResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/ArrayELResolver.java?rev=1501910&r1=1501909&r2=1501910&view=diff ============================================================================== --- tomcat/trunk/java/javax/el/ArrayELResolver.java (original) +++ tomcat/trunk/java/javax/el/ArrayELResolver.java Wed Jul 10 18:53:50 2013 @@ -19,7 +19,6 @@ package javax.el; import java.beans.FeatureDescriptor; import java.lang.reflect.Array; -import java.util.Arrays; import java.util.Iterator; public class ArrayELResolver extends ELResolver { @@ -42,8 +41,12 @@ public class ArrayELResolver extends ELR if (base != null && base.getClass().isArray()) { context.setPropertyResolved(base, property); - int idx = coerce(property); - checkBounds(base, idx); + try { + int idx = coerce(property); + checkBounds(base, idx); + } catch (IllegalArgumentException e) { + // ignore + } return base.getClass().getComponentType(); } @@ -104,8 +107,12 @@ public class ArrayELResolver extends ELR if (base != null && base.getClass().isArray()) { context.setPropertyResolved(base, property); - int idx = coerce(property); - checkBounds(base, idx); + try { + int idx = coerce(property); + checkBounds(base, idx); + } catch (IllegalArgumentException e) { + // ignore + } } return this.readOnly; @@ -113,20 +120,6 @@ public class ArrayELResolver extends ELR @Override public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) { - if (base != null && base.getClass().isArray()) { - FeatureDescriptor[] descs = new FeatureDescriptor[Array.getLength(base)]; - for (int i = 0; i < descs.length; i++) { - descs[i] = new FeatureDescriptor(); - descs[i].setDisplayName("["+i+"]"); - descs[i].setExpert(false); - descs[i].setHidden(false); - descs[i].setName(""+i); - descs[i].setPreferred(true); - descs[i].setValue(RESOLVABLE_AT_DESIGN_TIME, Boolean.FALSE); - descs[i].setValue(TYPE, Integer.class); - } - return Arrays.asList(descs).iterator(); - } return null; } Added: tomcat/trunk/test/javax/el/TestArrayELResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TestArrayELResolver.java?rev=1501910&view=auto ============================================================================== --- tomcat/trunk/test/javax/el/TestArrayELResolver.java (added) +++ tomcat/trunk/test/javax/el/TestArrayELResolver.java Wed Jul 10 18:53:50 2013 @@ -0,0 +1,376 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 javax.el; + +import org.junit.Assert; +import org.junit.Test; + +public class TestArrayELResolver { + + /** + * Tests that a null context results in an NPE as per EL Javadoc. + */ + @Test(expected = NullPointerException.class) + public void testGetType01() { + ArrayELResolver resolver = new ArrayELResolver(); + resolver.getType(null, new Object(), new Object()); + } + + /** + * Tests that a valid property is not resolved if base is not an array. + */ + @Test + public void testGetType02() { + doNegativeTest(new Object(), new Object(), MethodUnderTest.GET_TYPE, + true); + } + + /** + * Tests that a valid property is resolved. + */ + @Test + public void testGetType03() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + Class<?> result = resolver.getType(context, base, new Integer(0)); + + Assert.assertEquals(base.getClass().getComponentType(), result); + Assert.assertTrue(context.isPropertyResolved()); + } + + /** + * Tests that the key is out of bounds and exception will be thrown. + */ + @Test(expected = PropertyNotFoundException.class) + public void testGetType04() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.getType(context, base, new Integer(1)); + } + + /** + * Tests that a result is returned even when a coercion cannot be performed. + */ + @Test + public void testGetType05() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + Class<?> result = resolver.getType(context, base, "index"); + + Assert.assertEquals(base.getClass().getComponentType(), result); + Assert.assertTrue(context.isPropertyResolved()); + } + + /** + * Tests that a null context results in an NPE as per EL Javadoc. + */ + @Test(expected = NullPointerException.class) + public void testGetValue01() { + ArrayELResolver resolver = new ArrayELResolver(); + resolver.getValue(null, new Object(), new Object()); + } + + /** + * Tests that a valid property is not resolved if base is not an array. + */ + @Test + public void testGetValue02() { + doNegativeTest(new Object(), new Object(), MethodUnderTest.GET_VALUE, + true); + } + + /** + * Tests that a valid property is resolved. + */ + @Test + public void testGetValue03() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + Object result = resolver.getValue(context, base, new Integer(0)); + + Assert.assertEquals("element", result); + Assert.assertTrue(context.isPropertyResolved()); + } + + /** + * Tests a coercion cannot be performed as the key is not integer. + */ + @Test(expected = IllegalArgumentException.class) + public void testGetValue04() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.getValue(context, base, "key"); + } + + /** + * Tests that the key is out of bounds and null will be returned. + */ + @Test + public void testGetValue05() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + Object result = resolver.getValue(context, base, new Integer(1)); + + Assert.assertNull(result); + Assert.assertTrue(context.isPropertyResolved()); + + result = resolver.getValue(context, base, new Integer(-1)); + + Assert.assertNull(result); + Assert.assertTrue(context.isPropertyResolved()); + } + + /** + * Tests that a null context results in an NPE as per EL Javadoc. + */ + @Test(expected = NullPointerException.class) + public void testSetValue01() { + ArrayELResolver resolver = new ArrayELResolver(); + resolver.setValue(null, new Object(), new Object(), new Object()); + } + + /** + * Tests that a valid property is not set if base is not an array. + */ + @Test + public void testSetValue02() { + doNegativeTest(new Object(), new Object(), MethodUnderTest.SET_VALUE, + false); + } + + /** + * Tests that an exception is thrown when readOnly is true. + */ + @Test(expected = PropertyNotWritableException.class) + public void testSetValue03() { + ArrayELResolver resolver = new ArrayELResolver(true); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + resolver.setValue(context, new String[] {}, new Object(), new Object()); + } + + /** + * Tests that a valid property is set. + */ + @Test + public void testSetValue04() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.setValue(context, base, new Integer(0), "new-element"); + + Assert.assertEquals("new-element", + resolver.getValue(context, base, new Integer(0))); + Assert.assertTrue(context.isPropertyResolved()); + + resolver.setValue(context, base, new Integer(0), null); + + Assert.assertEquals(null, + resolver.getValue(context, base, new Integer(0))); + Assert.assertTrue(context.isPropertyResolved()); + } + + /** + * Tests a coercion cannot be performed as the key is not integer. + */ + @Test(expected = IllegalArgumentException.class) + public void testSetValue05() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.setValue(context, base, "key", "new-element"); + } + + /** + * Tests that the key is out of bounds and exception will be thrown. + */ + @Test(expected = PropertyNotFoundException.class) + public void testSetValue06() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.setValue(context, base, new Integer(1), "new-element"); + } + + /** + * Tests that an exception will be thrown if the value is not from the + * corresponding type. + */ + @Test(expected = ClassCastException.class) + public void testSetValue07() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.setValue(context, base, new Integer(0), new Integer(1)); + } + + /** + * Tests that a null context results in an NPE as per EL Javadoc. + */ + @Test(expected = NullPointerException.class) + public void testIsReadOnly01() { + ArrayELResolver resolver = new ArrayELResolver(); + resolver.isReadOnly(null, new Object(), new Object()); + } + + /** + * Tests that the propertyResolved is false if base is not an array. + */ + @Test + public void testIsReadOnly02() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + boolean result = resolver.isReadOnly(context, new Object(), + new Object()); + + Assert.assertFalse(result); + Assert.assertFalse(context.isPropertyResolved()); + + resolver = new ArrayELResolver(true); + + result = resolver.isReadOnly(context, new Object(), new Object()); + + Assert.assertTrue(result); + Assert.assertFalse(context.isPropertyResolved()); + } + + /** + * Tests that if the ArrayELResolver is constructed with readOnly the method + * will return always true, otherwise false. + */ + @Test + public void testIsReadOnly03() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + boolean result = resolver.isReadOnly(context, base, new Integer(0)); + + Assert.assertFalse(result); + Assert.assertTrue(context.isPropertyResolved()); + + resolver = new ArrayELResolver(true); + + result = resolver.isReadOnly(context, base, new Integer(0)); + + Assert.assertTrue(result); + Assert.assertTrue(context.isPropertyResolved()); + } + + /** + * Tests that the key is out of bounds and exception will be thrown. + */ + @Test(expected = PropertyNotFoundException.class) + public void testIsReadOnly04() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + resolver.isReadOnly(context, base, new Integer(1)); + } + + /** + * Tests that a result is returned even when a coercion cannot be performed. + */ + @Test + public void testIsReadOnly05() { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + String[] base = new String[] { "element" }; + boolean result = resolver.isReadOnly(context, base, "key"); + + Assert.assertFalse(result); + Assert.assertTrue(context.isPropertyResolved()); + + resolver = new ArrayELResolver(true); + + result = resolver.isReadOnly(context, base, "key"); + + Assert.assertTrue(result); + Assert.assertTrue(context.isPropertyResolved()); + } + + private void doNegativeTest(Object base, Object trigger, + MethodUnderTest method, boolean checkResult) { + ArrayELResolver resolver = new ArrayELResolver(); + ELContext context = new StandardELContext( + ELManager.getExpressionFactory()); + + Object result = null; + switch (method) { + case GET_VALUE: { + result = resolver.getValue(context, base, trigger); + break; + } + case SET_VALUE: { + resolver.setValue(context, base, trigger, new Object()); + break; + } + case GET_TYPE: { + result = resolver.getType(context, base, trigger); + break; + } + default: { + // Should never happen + Assert.fail("Missing case for method"); + } + } + + if (checkResult) { + Assert.assertNull(result); + } + Assert.assertFalse(context.isPropertyResolved()); + } + + private static enum MethodUnderTest { + GET_VALUE, SET_VALUE, GET_TYPE + } + +} Propchange: tomcat/trunk/test/javax/el/TestArrayELResolver.java ------------------------------------------------------------------------------ svn:eol-style = native --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org