You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by vi...@apache.org on 2013/07/07 06:45:43 UTC

svn commit: r1500368 - in /tomcat/trunk: java/javax/el/BeanELResolver.java java/javax/el/StaticFieldELResolver.java java/javax/el/Util.java test/javax/el/TestStaticFieldELResolver.java test/javax/el/TesterClass.java

Author: violetagg
Date: Sun Jul  7 04:45:43 2013
New Revision: 1500368

URL: http://svn.apache.org/r1500368
Log:
javax.el.StaticFieldELResolver:
1. isReadOnly - always return true
2. do not check constructor for static modifier
3. invoke - when searching for method/constructor use the class provided by ELClass
4. unit test

Added:
    tomcat/trunk/test/javax/el/TestStaticFieldELResolver.java   (with props)
    tomcat/trunk/test/javax/el/TesterClass.java   (with props)
Modified:
    tomcat/trunk/java/javax/el/BeanELResolver.java
    tomcat/trunk/java/javax/el/StaticFieldELResolver.java
    tomcat/trunk/java/javax/el/Util.java

Modified: tomcat/trunk/java/javax/el/BeanELResolver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/BeanELResolver.java?rev=1500368&r1=1500367&r2=1500368&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/BeanELResolver.java (original)
+++ tomcat/trunk/java/javax/el/BeanELResolver.java Sun Jul  7 04:45:43 2013
@@ -168,7 +168,7 @@ public class BeanELResolver extends ELRe
 
         // Find the matching method
         Method matchingMethod =
-                Util.findMethod(base, methodName, paramTypes, params);
+                Util.findMethod(base.getClass(), methodName, paramTypes, params);
 
         Object[] parameters = Util.buildParameters(
                 matchingMethod.getParameterTypes(), matchingMethod.isVarArgs(),

Modified: tomcat/trunk/java/javax/el/StaticFieldELResolver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/StaticFieldELResolver.java?rev=1500368&r1=1500367&r2=1500368&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/StaticFieldELResolver.java (original)
+++ tomcat/trunk/java/javax/el/StaticFieldELResolver.java Sun Jul  7 04:45:43 2013
@@ -100,14 +100,7 @@ public class StaticFieldELResolver exten
 
             if ("<init>".equals(methodName)) {
                 Constructor<?> match =
-                        Util.findConstructor(base, paramTypes, params);
-
-                int modifiers = match.getModifiers();
-                if (!Modifier.isStatic(modifiers)) {
-                    throw new MethodNotFoundException(Util.message(context,
-                            "staticFieldELResolver.methodNotFound", methodName,
-                            clazz.getName()));
-                }
+                        Util.findConstructor(clazz, paramTypes, params);
 
                 Object[] parameters = Util.buildParameters(
                         match.getParameterTypes(), match.isVarArgs(), params);
@@ -128,7 +121,7 @@ public class StaticFieldELResolver exten
 
             } else {
                 Method match =
-                        Util.findMethod(base, methodName, paramTypes, params);
+                        Util.findMethod(clazz, methodName, paramTypes, params);
 
                 int modifiers = match.getModifiers();
                 if (!Modifier.isStatic(modifiers)) {
@@ -142,7 +135,7 @@ public class StaticFieldELResolver exten
 
                 Object result = null;
                 try {
-                    result = match.invoke(base, parameters);
+                    result = match.invoke(null, parameters);
                 } catch (IllegalArgumentException | IllegalAccessException e) {
                     throw new ELException(e);
                 } catch (InvocationTargetException e) {
@@ -199,10 +192,8 @@ public class StaticFieldELResolver exten
 
         if (base instanceof ELClass && property instanceof String) {
             context.setPropertyResolved(true);
-
-            return true;
         }
-        return false;
+        return true;
     }
 
 

Modified: tomcat/trunk/java/javax/el/Util.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/Util.java?rev=1500368&r1=1500367&r2=1500368&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/Util.java (original)
+++ tomcat/trunk/java/javax/el/Util.java Sun Jul  7 04:45:43 2013
@@ -185,12 +185,11 @@ class Util {
     }
 
 
-    static Method findMethod(Object base, String methodName,
+    static Method findMethod(Class<?> clazz, String methodName,
             Class<?>[] paramTypes, Object[] params) {
 
         Method matchingMethod = null;
 
-        Class<?> clazz = base.getClass();
         if (paramTypes != null) {
             try {
                 matchingMethod =
@@ -261,12 +260,11 @@ class Util {
     }
 
 
-    static Constructor<?> findConstructor(Object base, Class<?>[] paramTypes,
+    static Constructor<?> findConstructor(Class<?> clazz, Class<?>[] paramTypes,
             Object[] params) {
 
         Constructor<?> match = null;
 
-        Class<?> clazz = base.getClass();
         if (paramTypes != null) {
             try {
                 match = getConstructor(clazz, clazz.getConstructor(paramTypes));

Added: tomcat/trunk/test/javax/el/TestStaticFieldELResolver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TestStaticFieldELResolver.java?rev=1500368&view=auto
==============================================================================
--- tomcat/trunk/test/javax/el/TestStaticFieldELResolver.java (added)
+++ tomcat/trunk/test/javax/el/TestStaticFieldELResolver.java Sun Jul  7 04:45:43 2013
@@ -0,0 +1,490 @@
+/*
+ * 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 TestStaticFieldELResolver {
+
+    private static final String PROPERTY01_NAME = "publicStaticString";
+    private static final String PROPERTY01_VALUE = "publicStaticStringNewValue";
+    private static final String PROPERTY02_NAME = "nonExistingString";
+    private static final String PROPERTY03_NAME = "publicString";
+    private static final String PROPERTY04_NAME = "privateStaticString";
+    private static final String PROPERTY05_NAME = "privateString";
+    private static final String METHOD01_NAME = "<init>";
+    private static final String METHOD02_NAME = "getPublicStaticString";
+    private static final String METHOD03_NAME = "setPrivateString";
+    private static final String METHOD04_NAME = "printPublicStaticString";
+
+    /**
+     * Tests that a null context results in an NPE as per EL Javadoc.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testGetValue01() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        resolver.getValue(null, new Object(), new Object());
+    }
+
+    /**
+     * Tests that a valid property is resolved.
+     */
+    @Test
+    public void testGetValue02() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Object result = resolver.getValue(context, new ELClass(
+                TesterClass.class), PROPERTY01_NAME);
+
+        Assert.assertEquals(PROPERTY01_NAME, result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that a valid property is not resolved if base is not ELCLass.
+     */
+    @Test
+    public void testGetValue03() {
+        doNegativeTest(new Object(), PROPERTY01_NAME, MethodUnderTest.GET_VALUE);
+    }
+
+    /**
+     * Tests that non String property is not resolved.
+     */
+    @Test
+    public void testGetValue04() {
+        doNegativeTest(new ELClass(TesterClass.class), new Object(),
+                MethodUnderTest.GET_VALUE);
+    }
+
+    /**
+     * Property doesn't exist
+     */
+    @Test
+    public void testGetValue05() {
+        doThrowableTest(PROPERTY02_NAME, MethodUnderTest.GET_VALUE, true);
+    }
+
+    /**
+     * Property is not static
+     */
+    @Test
+    public void testGetValue06() {
+        doThrowableTest(PROPERTY03_NAME, MethodUnderTest.GET_VALUE, false);
+    }
+
+    /**
+     * Property is not public
+     */
+    @Test
+    public void testGetValue07() {
+        doThrowableTest(PROPERTY04_NAME, MethodUnderTest.GET_VALUE, true);
+    }
+
+    /**
+     * Property is neither public nor static
+     */
+    @Test
+    public void testGetValue08() {
+        doThrowableTest(PROPERTY05_NAME, MethodUnderTest.GET_VALUE, true);
+    }
+
+    /**
+     * Tests that a valid property of Enum is resolved.
+     */
+    @Test
+    public void testGetValue09() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Object result = resolver.getValue(context, new ELClass(
+                MethodUnderTest.class), MethodUnderTest.GET_TYPE.toString());
+
+        Assert.assertEquals(MethodUnderTest.GET_TYPE, 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() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        resolver.setValue(null, new Object(), new Object(), new Object());
+    }
+
+    /**
+     * Tests that cannot write to a static field.
+     */
+    @Test(expected = PropertyNotWritableException.class)
+    public void testSetValue02() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        resolver.setValue(context, new ELClass(TesterClass.class),
+                PROPERTY01_NAME, PROPERTY01_VALUE);
+    }
+
+    /**
+     * Tests that the operation is not invoked if base is not ELCLass.
+     */
+    @Test
+    public void testSetValue03() {
+        doNegativeTest(new Object(), PROPERTY01_NAME, MethodUnderTest.SET_VALUE);
+    }
+
+    /**
+     * Tests that the operation is no invoked when the property is not String.
+     */
+    @Test
+    public void testSetValue04() {
+        doNegativeTest(new ELClass(TesterClass.class), new Object(),
+                MethodUnderTest.SET_VALUE);
+    }
+
+    /**
+     * Tests that a null context results in an NPE as per EL Javadoc.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testIsReadOnly01() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        resolver.isReadOnly(null, new Object(), new Object());
+    }
+
+    /**
+     * Tests that the propertyResolved is true when base is ELCLass and the
+     * property is String.
+     */
+    @Test
+    public void testIsReadOnly02() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        boolean result = resolver.isReadOnly(context, new ELClass(
+                TesterClass.class), PROPERTY01_NAME);
+
+        Assert.assertTrue(result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that the propertyResolved is false if base is not ELCLass.
+     */
+    @Test
+    public void testIsReadOnly03() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        boolean result = resolver.isReadOnly(context, new Object(),
+                PROPERTY01_NAME);
+
+        Assert.assertTrue(result);
+        Assert.assertFalse(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that the propertyResolved is false when the property is not String.
+     */
+    @Test
+    public void testIsReadOnly04() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        boolean result = resolver.isReadOnly(context, new ELClass(
+                TesterClass.class), new Object());
+
+        Assert.assertTrue(result);
+        Assert.assertFalse(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that a null context results in an NPE as per EL Javadoc.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testGetType01() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        resolver.getType(null, new Object(), new Object());
+    }
+
+    /**
+     * Tests that a valid property is resolved.
+     */
+    @Test
+    public void testGetType02() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Class<?> result = resolver.getType(context, new ELClass(
+                TesterClass.class), PROPERTY01_NAME);
+
+        Assert.assertEquals(PROPERTY01_NAME.getClass(), result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that a valid property is not resolved if base is not ELCLass.
+     */
+    @Test
+    public void testGetType03() {
+        doNegativeTest(new Object(), PROPERTY01_NAME, MethodUnderTest.GET_TYPE);
+    }
+
+    /**
+     * Tests that non String property is not resolved.
+     */
+    @Test
+    public void testGetType04() {
+        doNegativeTest(new ELClass(TesterClass.class), new Object(),
+                MethodUnderTest.GET_TYPE);
+    }
+
+    /**
+     * Property doesn't exist
+     */
+    @Test
+    public void testGetType05() {
+        doThrowableTest(PROPERTY02_NAME, MethodUnderTest.GET_TYPE, true);
+    }
+
+    /**
+     * Property is not static
+     */
+    @Test
+    public void testGetType06() {
+        doThrowableTest(PROPERTY03_NAME, MethodUnderTest.GET_TYPE, false);
+    }
+
+    /**
+     * Property is not public
+     */
+    @Test
+    public void testGetType07() {
+        doThrowableTest(PROPERTY04_NAME, MethodUnderTest.GET_TYPE, true);
+    }
+
+    /**
+     * Property is neither public nor static
+     */
+    @Test
+    public void testGetType08() {
+        doThrowableTest(PROPERTY05_NAME, MethodUnderTest.GET_TYPE, true);
+    }
+
+    /**
+     * Tests that a valid property of Enum is resolved.
+     */
+    @Test
+    public void testGetType09() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Class<?> result = resolver.getType(context, new ELClass(
+                MethodUnderTest.class), MethodUnderTest.GET_TYPE.toString());
+
+        Assert.assertEquals(MethodUnderTest.GET_TYPE.getClass(), result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that a null context results in an NPE as per EL Javadoc.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testInvoke01() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        resolver.invoke(null, new Object(), new Object(), new Class<?>[] {},
+                new Object[] {});
+    }
+
+    /**
+     * Tests a constructor invocation.
+     */
+    @Test
+    public void testInvoke02() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Object result = resolver.invoke(context,
+                new ELClass(TesterClass.class), METHOD01_NAME, null, null);
+
+        Assert.assertEquals(TesterClass.class, result.getClass());
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests a method invocation.
+     */
+    @Test
+    public void testInvoke03() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Object result = resolver.invoke(context,
+                new ELClass(TesterClass.class), METHOD02_NAME,
+                new Class<?>[] {}, new Object[] {});
+
+        Assert.assertEquals(PROPERTY01_NAME, result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    /**
+     * Tests that a valid method is not resolved if base is not ELCLass.
+     */
+    @Test
+    public void testInvoke04() {
+        doNegativeTest(new Object(), METHOD02_NAME, MethodUnderTest.INVOKE);
+    }
+
+    /**
+     * Tests that non String method name is not resolved.
+     */
+    @Test
+    public void testInvoke05() {
+        doNegativeTest(new ELClass(TesterClass.class), new Object(),
+                MethodUnderTest.INVOKE);
+    }
+
+    /**
+     * Tests that a private constructor invocation will fail.
+     */
+    @Test
+    public void testInvoke06() {
+        doThrowableTest(METHOD01_NAME, MethodUnderTest.INVOKE, true);
+    }
+
+    /**
+     * Tests that a non static method invocation will fail.
+     */
+    @Test
+    public void testInvoke07() {
+        doThrowableTest(METHOD03_NAME, MethodUnderTest.INVOKE, false);
+    }
+
+    /**
+     * Tests a void method invocation.
+     */
+    @Test
+    public void testInvoke08() {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Object result = resolver.invoke(context,
+                new ELClass(TesterClass.class), METHOD04_NAME,
+                new Class<?>[] {}, new Object[] {});
+
+        Assert.assertNull(result);
+        Assert.assertTrue(context.isPropertyResolved());
+    }
+
+    private void doNegativeTest(Object elClass, Object trigger,
+            MethodUnderTest method) {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        Object result = null;
+        switch (method) {
+        case GET_VALUE: {
+            result = resolver.getValue(context, elClass, trigger);
+            break;
+        }
+        case SET_VALUE: {
+            resolver.setValue(context, elClass, trigger, PROPERTY01_VALUE);
+            result = resolver.getValue(context, elClass, trigger);
+            break;
+        }
+        case GET_TYPE: {
+            result = resolver.getType(context, elClass, trigger);
+            break;
+        }
+        case INVOKE: {
+            result = resolver.invoke(context, elClass, trigger,
+                    new Class<?>[] { String.class }, new Object[] { "test" });
+            break;
+        }
+        default: {
+            // Should never happen
+            Assert.fail("Missing case for method");
+        }
+        }
+
+        Assert.assertNull(result);
+        Assert.assertFalse(context.isPropertyResolved());
+    }
+
+    private void doThrowableTest(String trigger, MethodUnderTest method,
+            boolean checkCause) {
+        StaticFieldELResolver resolver = new StaticFieldELResolver();
+        ELContext context = new StandardELContext(
+                ELManager.getExpressionFactory());
+
+        ELException exception = null;
+        try {
+            switch (method) {
+            case GET_VALUE: {
+                resolver.getValue(context, new ELClass(TesterClass.class),
+                        trigger);
+                break;
+            }
+            case GET_TYPE: {
+                resolver.getType(context, new ELClass(TesterClass.class),
+                        trigger);
+                break;
+            }
+            case INVOKE: {
+                resolver.invoke(context, new ELClass(TesterClass.class),
+                        trigger, new Class<?>[] { String.class },
+                        new Object[] { "test" });
+                break;
+            }
+            default: {
+                // Should never happen
+                Assert.fail("Missing case for method");
+            }
+            }
+
+        } catch (PropertyNotFoundException | MethodNotFoundException e) {
+            exception = e;
+        }
+
+        Assert.assertTrue(context.isPropertyResolved());
+        Assert.assertNotNull(exception);
+
+        if (checkCause) {
+            @SuppressWarnings("null")
+            // Can't be null due to assertion above
+            Throwable cause = exception.getCause();
+            Assert.assertNotNull(cause);
+        }
+    }
+
+    private static enum MethodUnderTest {
+        GET_VALUE, SET_VALUE, GET_TYPE, INVOKE
+    }
+}

Propchange: tomcat/trunk/test/javax/el/TestStaticFieldELResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/test/javax/el/TesterClass.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/javax/el/TesterClass.java?rev=1500368&view=auto
==============================================================================
--- tomcat/trunk/test/javax/el/TesterClass.java (added)
+++ tomcat/trunk/test/javax/el/TesterClass.java Sun Jul  7 04:45:43 2013
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+public class TesterClass {
+
+    public static String publicStaticString = "publicStaticString";
+    public String publicString = "publicString";
+    private static String privateStaticString = "privateStaticString";
+    private String privateString = "privateString";
+
+    public TesterClass() {
+    }
+
+    private TesterClass(String privateString) {
+        this.privateString = privateString;
+    }
+
+    public static String getPublicStaticString() {
+        return publicStaticString;
+    }
+
+    public static void printPublicStaticString() {
+        System.out.println(publicStaticString);
+    }
+
+    public void setPrivateString(String privateString) {
+        this.privateString = privateString;
+    }
+}

Propchange: tomcat/trunk/test/javax/el/TesterClass.java
------------------------------------------------------------------------------
    svn:eol-style = native



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