You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Gary Gregory <ga...@gmail.com> on 2014/12/02 17:20:03 UTC

Fwd: svn commit: r1642927 - in /commons/proper/jexl/trunk: ./ src/main/java/org/apache/commons/jexl3/internal/introspection/ src/main/java/org/apache/commons/jexl3/introspection/ src/site/xdoc/ src/test/java/org/apache/commons/jexl3/

Wow, I have not seen a commit in here in a long time...

Any thoughts a cutting a release?

Gary
---------- Forwarded message ----------
From: <he...@apache.org>
Date: Tue, Dec 2, 2014 at 11:15 AM
Subject: svn commit: r1642927 - in /commons/proper/jexl/trunk: ./
src/main/java/org/apache/commons/jexl3/internal/introspection/
src/main/java/org/apache/commons/jexl3/introspection/ src/site/xdoc/
src/test/java/org/apache/commons/jexl3/
To: commits@commons.apache.org


Author: henrib
Date: Tue Dec  2 16:15:35 2014
New Revision: 1642927

URL: http://svn.apache.org/r1642927
Log:
Depending on unkown conditions, overriden varargs method may return false
to isVarArgs;
Fix by checking method in declaring class hierarchy (MethodKey.isVarArgs).

Modified:
    commons/proper/jexl/trunk/pom.xml

commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java

commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
    commons/proper/jexl/trunk/src/site/xdoc/changes.xml

commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java

commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java

Modified: commons/proper/jexl/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/pom.xml?rev=1642927&r1=1642926&r2=1642927&view=diff
==============================================================================
--- commons/proper/jexl/trunk/pom.xml (original)
+++ commons/proper/jexl/trunk/pom.xml Tue Dec  2 16:15:35 2014
@@ -19,7 +19,7 @@
     <parent>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-parent</artifactId>
-        <version>25</version>
+        <version>30</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.apache.commons</groupId>
@@ -100,9 +100,9 @@

     <dependencies>
         <dependency>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-            <version>1.1.3</version>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
@@ -208,6 +208,7 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-scm-publish-plugin</artifactId>
+            <version>1.0-beta-2</version>
             <configuration>
               <ignorePathsToDelete>
                 <ignorePathToDelete>javadocs</ignorePathToDelete>

Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java?rev=1642927&r1=1642926&r2=1642927&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
Tue Dec  2 16:15:35 2014
@@ -217,31 +217,40 @@ public final class MethodKey {
     }

     /**
-     * Checks whether a method is accepts a variable number of arguments.
+     * Checks whether a method accepts a variable number of arguments.
      * <p>May be due to a subtle bug in some JVMs, if a varargs method is
an override, depending on (may be) the
      * class introspection order, the isVarargs flag on the method itself
will be false.
-     * To circumvent the potential problem, fetch the method with the same
signature from iniial method declaring class,
-     * - which will be different if overriden  -and get the varargs flag
from it.
+     * To circumvent the potential problem, fetch the method with the same
signature from the super-classes,
+     * - which will be different if override  -and get the varargs flag
from it.
      * @param method the method to check for varargs
      * @return true if declared varargs, false otherwise
      */
-    public static boolean isVarArgs(Method method) {
+    public static boolean isVarArgs(final Method method) {
         if (method == null) {
             return false;
         }
         if (method.isVarArgs()) {
             return true;
         }
+        // before climbing up the hierarchy, verify that the last
parameter is an array
+        final Class<?>[] ptypes = method.getParameterTypes();
+        if (ptypes.length > 0 && ptypes[ptypes.length -
1].getComponentType() == null) {
+            return false;
+        }
+        final String mname = method.getName();
         // if this is an override, was it actually declared as varargs?
         Class<?> clazz = method.getDeclaringClass();
-        try {
-            Method m = clazz.getMethod(method.getName(),
method.getParameterTypes());
-            if (m.isVarArgs()) {
-                return true;
+        do {
+            try {
+                Method m = clazz.getMethod(mname, ptypes);
+                if (m.isVarArgs()) {
+                    return true;
+                }
+            } catch (NoSuchMethodException xignore) {
+                // this should not happen...
             }
-        } catch (NoSuchMethodException xignore) {
-            // this should not happen...
-        }
+            clazz = clazz.getSuperclass();
+        } while(clazz != null);
         return false;
     }


Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java?rev=1642927&r1=1642926&r2=1642927&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
Tue Dec  2 16:15:35 2014
@@ -42,8 +42,8 @@ public interface JexlMethod {
      * Attempts to reuse this JexlMethod, checking that it is compatible
with
      * the actual set of arguments.
      * Related to isCacheable since this method is often used with cached
JexlMethod instances.
-     * @param obj the object to invoke the method upon
      * @param name the method name
+     * @param obj the object to invoke the method upon
      * @param params the method arguments
      * @return the result of the method invocation that should be checked
by tryFailed to determine if it succeeded
      * or failed.

Modified: commons/proper/jexl/trunk/src/site/xdoc/changes.xml
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/site/xdoc/changes.xml?rev=1642927&r1=1642926&r2=1642927&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/jexl/trunk/src/site/xdoc/changes.xml Tue Dec  2 16:15:35
2014
@@ -26,6 +26,13 @@
     </properties>
     <body>
         <release version="3.0.1" date="unreleased">
+            <action dev="henrib" type="fix" >
+                Depending on unkown conditions, overriden varargs method
may return false to isVarArgs;
+                fix by checking method in declaring class hierarchy.
+            </action>
+            <action dev="henrib" type="fix">
+                Performance problem in Interpreter.unknownVariable
mechanism
+            </action>
             <action dev="henrib" type="fix" issue="JEXL-146" due-to="David
Maplesden">
                 Performance problem in Interpreter.unknownVariable
mechanism
             </action>

Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java?rev=1642927&r1=1642926&r2=1642927&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
Tue Dec  2 16:15:35 2014
@@ -194,4 +194,31 @@ public class ClassCreatorTest extends Je
         }
     }

+    public static class TwoCtors {
+        int value;
+
+        public TwoCtors(int v) {
+            this.value = v;
+        }
+
+        public TwoCtors(Number x) {
+            this.value = -x.intValue();
+        }
+
+        public int getValue() {
+            return value;
+        }
+    }
+
+    public void testBasicCtor() throws Exception {
+        JexlScript s = jexl.createScript("(c, v)->{ var ct2 = new(c, v);
ct2.value; }");
+        Object r = s.execute(null, TwoCtors.class, 10);
+        assertEquals(10, r);
+        r = s.execute(null, TwoCtors.class, 5 + 5);
+        assertEquals(10, r);
+        r = s.execute(null, TwoCtors.class, 10d);
+        assertEquals(-10, r);
+        r = s.execute(null, TwoCtors.class, 100f);
+        assertEquals(-100, r);
+    }
 }

Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java?rev=1642927&r1=1642926&r2=1642927&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
Tue Dec  2 16:15:35 2014
@@ -1069,4 +1069,22 @@ public class IssuesTest extends JexlTest
         }
         assertNull("The arr2 property value should remain as null, not an
empty array.", quux.arr2);
     }
+
+    public void test147() throws Exception {
+        JexlEngine JEXL = new Engine();
+        JexlContext jc = new MapContext();
+        JexlExpression e147 = JEXL.createExpression("quux = [one, two]");
+
+        jc.set("one", 1);
+        jc.set("two", 2);
+        int[] o1 = (int[])e147.evaluate(jc);
+        assertEquals(1, o1[0]);
+        assertEquals(2, o1[1]);
+
+        jc.set("one", 10);
+        jc.set("two", 20);
+        int[] o2 = (int[]) e147.evaluate(jc);
+        assertEquals(10, o2[0]);
+        assertEquals(20, o2[1]);
+    }
 }





-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: svn commit: r1642927 - in /commons/proper/jexl/trunk: ./ src/main/java/org/apache/commons/jexl3/internal/introspection/ src/main/java/org/apache/commons/jexl3/introspection/ src/site/xdoc/ src/test/java/org/apache/commons/jexl3/

Posted by Benedikt Ritter <br...@apache.org>.
2014-12-02 17:20 GMT+01:00 Gary Gregory <ga...@gmail.com>:

> Wow, I have not seen a commit in here in a long time...
>
> Any thoughts a cutting a release?
>
> Gary
> ---------- Forwarded message ----------
> From: <he...@apache.org>
> Date: Tue, Dec 2, 2014 at 11:15 AM
> Subject: svn commit: r1642927 - in /commons/proper/jexl/trunk: ./
> src/main/java/org/apache/commons/jexl3/internal/introspection/
> src/main/java/org/apache/commons/jexl3/introspection/ src/site/xdoc/
> src/test/java/org/apache/commons/jexl3/
> To: commits@commons.apache.org
>
>
> Author: henrib
> Date: Tue Dec  2 16:15:35 2014
> New Revision: 1642927
>
> URL: http://svn.apache.org/r1642927
> Log:
> Depending on unkown conditions, overriden varargs method may return false
> to isVarArgs;
> Fix by checking method in declaring class hierarchy (MethodKey.isVarArgs).
>
> Modified:
>     commons/proper/jexl/trunk/pom.xml
>
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
>
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
>     commons/proper/jexl/trunk/src/site/xdoc/changes.xml
>
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
>
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
>
> Modified: commons/proper/jexl/trunk/pom.xml
> URL:
>
> http://svn.apache.org/viewvc/commons/proper/jexl/trunk/pom.xml?rev=1642927&r1=1642926&r2=1642927&view=diff
>
> ==============================================================================
> --- commons/proper/jexl/trunk/pom.xml (original)
> +++ commons/proper/jexl/trunk/pom.xml Tue Dec  2 16:15:35 2014
> @@ -19,7 +19,7 @@
>      <parent>
>          <groupId>org.apache.commons</groupId>
>          <artifactId>commons-parent</artifactId>
> -        <version>25</version>
> +        <version>30</version>
>

Latest parent is 35 ;-)


>      </parent>
>      <modelVersion>4.0.0</modelVersion>
>      <groupId>org.apache.commons</groupId>
> @@ -100,9 +100,9 @@
>
>      <dependencies>
>          <dependency>
> -            <groupId>commons-logging</groupId>
> -            <artifactId>commons-logging</artifactId>
> -            <version>1.1.3</version>
> +            <groupId>log4j</groupId>
> +            <artifactId>log4j</artifactId>
> +            <version>1.2.17</version>
>          </dependency>
>          <dependency>
>              <groupId>junit</groupId>
> @@ -208,6 +208,7 @@
>            <plugin>
>              <groupId>org.apache.maven.plugins</groupId>
>              <artifactId>maven-scm-publish-plugin</artifactId>
> +            <version>1.0-beta-2</version>
>              <configuration>
>                <ignorePathsToDelete>
>                  <ignorePathToDelete>javadocs</ignorePathToDelete>
>
> Modified:
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
> URL:
>
> http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java?rev=1642927&r1=1642926&r2=1642927&view=diff
>
> ==============================================================================
> ---
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
> (original)
> +++
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/MethodKey.java
> Tue Dec  2 16:15:35 2014
> @@ -217,31 +217,40 @@ public final class MethodKey {
>      }
>
>      /**
> -     * Checks whether a method is accepts a variable number of arguments.
> +     * Checks whether a method accepts a variable number of arguments.
>       * <p>May be due to a subtle bug in some JVMs, if a varargs method is
> an override, depending on (may be) the
>       * class introspection order, the isVarargs flag on the method itself
> will be false.
> -     * To circumvent the potential problem, fetch the method with the same
> signature from iniial method declaring class,
> -     * - which will be different if overriden  -and get the varargs flag
> from it.
> +     * To circumvent the potential problem, fetch the method with the same
> signature from the super-classes,
> +     * - which will be different if override  -and get the varargs flag
> from it.
>       * @param method the method to check for varargs
>       * @return true if declared varargs, false otherwise
>       */
> -    public static boolean isVarArgs(Method method) {
> +    public static boolean isVarArgs(final Method method) {
>          if (method == null) {
>              return false;
>          }
>          if (method.isVarArgs()) {
>              return true;
>          }
> +        // before climbing up the hierarchy, verify that the last
> parameter is an array
> +        final Class<?>[] ptypes = method.getParameterTypes();
> +        if (ptypes.length > 0 && ptypes[ptypes.length -
> 1].getComponentType() == null) {
> +            return false;
> +        }
> +        final String mname = method.getName();
>          // if this is an override, was it actually declared as varargs?
>          Class<?> clazz = method.getDeclaringClass();
> -        try {
> -            Method m = clazz.getMethod(method.getName(),
> method.getParameterTypes());
> -            if (m.isVarArgs()) {
> -                return true;
> +        do {
> +            try {
> +                Method m = clazz.getMethod(mname, ptypes);
> +                if (m.isVarArgs()) {
> +                    return true;
> +                }
> +            } catch (NoSuchMethodException xignore) {
> +                // this should not happen...
>              }
> -        } catch (NoSuchMethodException xignore) {
> -            // this should not happen...
> -        }
> +            clazz = clazz.getSuperclass();
> +        } while(clazz != null);
>          return false;
>      }
>
>
> Modified:
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
> URL:
>
> http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java?rev=1642927&r1=1642926&r2=1642927&view=diff
>
> ==============================================================================
> ---
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
> (original)
> +++
>
> commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/introspection/JexlMethod.java
> Tue Dec  2 16:15:35 2014
> @@ -42,8 +42,8 @@ public interface JexlMethod {
>       * Attempts to reuse this JexlMethod, checking that it is compatible
> with
>       * the actual set of arguments.
>       * Related to isCacheable since this method is often used with cached
> JexlMethod instances.
> -     * @param obj the object to invoke the method upon
>       * @param name the method name
> +     * @param obj the object to invoke the method upon
>       * @param params the method arguments
>       * @return the result of the method invocation that should be checked
> by tryFailed to determine if it succeeded
>       * or failed.
>
> Modified: commons/proper/jexl/trunk/src/site/xdoc/changes.xml
> URL:
>
> http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/site/xdoc/changes.xml?rev=1642927&r1=1642926&r2=1642927&view=diff
>
> ==============================================================================
> --- commons/proper/jexl/trunk/src/site/xdoc/changes.xml (original)
> +++ commons/proper/jexl/trunk/src/site/xdoc/changes.xml Tue Dec  2 16:15:35
> 2014
> @@ -26,6 +26,13 @@
>      </properties>
>      <body>
>          <release version="3.0.1" date="unreleased">
> +            <action dev="henrib" type="fix" >
> +                Depending on unkown conditions, overriden varargs method
> may return false to isVarArgs;
> +                fix by checking method in declaring class hierarchy.
> +            </action>
> +            <action dev="henrib" type="fix">
> +                Performance problem in Interpreter.unknownVariable
> mechanism
> +            </action>
>              <action dev="henrib" type="fix" issue="JEXL-146" due-to="David
> Maplesden">
>                  Performance problem in Interpreter.unknownVariable
> mechanism
>              </action>
>
> Modified:
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
> URL:
>
> http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java?rev=1642927&r1=1642926&r2=1642927&view=diff
>
> ==============================================================================
> ---
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
> (original)
> +++
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/ClassCreatorTest.java
> Tue Dec  2 16:15:35 2014
> @@ -194,4 +194,31 @@ public class ClassCreatorTest extends Je
>          }
>      }
>
> +    public static class TwoCtors {
> +        int value;
> +
> +        public TwoCtors(int v) {
> +            this.value = v;
> +        }
> +
> +        public TwoCtors(Number x) {
> +            this.value = -x.intValue();
> +        }
> +
> +        public int getValue() {
> +            return value;
> +        }
> +    }
> +
> +    public void testBasicCtor() throws Exception {
> +        JexlScript s = jexl.createScript("(c, v)->{ var ct2 = new(c, v);
> ct2.value; }");
> +        Object r = s.execute(null, TwoCtors.class, 10);
> +        assertEquals(10, r);
> +        r = s.execute(null, TwoCtors.class, 5 + 5);
> +        assertEquals(10, r);
> +        r = s.execute(null, TwoCtors.class, 10d);
> +        assertEquals(-10, r);
> +        r = s.execute(null, TwoCtors.class, 100f);
> +        assertEquals(-100, r);
> +    }
>  }
>
> Modified:
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
> URL:
>
> http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java?rev=1642927&r1=1642926&r2=1642927&view=diff
>
> ==============================================================================
> ---
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
> (original)
> +++
>
> commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java
> Tue Dec  2 16:15:35 2014
> @@ -1069,4 +1069,22 @@ public class IssuesTest extends JexlTest
>          }
>          assertNull("The arr2 property value should remain as null, not an
> empty array.", quux.arr2);
>      }
> +
> +    public void test147() throws Exception {
> +        JexlEngine JEXL = new Engine();
> +        JexlContext jc = new MapContext();
> +        JexlExpression e147 = JEXL.createExpression("quux = [one, two]");
> +
> +        jc.set("one", 1);
> +        jc.set("two", 2);
> +        int[] o1 = (int[])e147.evaluate(jc);
> +        assertEquals(1, o1[0]);
> +        assertEquals(2, o1[1]);
> +
> +        jc.set("one", 10);
> +        jc.set("two", 20);
> +        int[] o2 = (int[]) e147.evaluate(jc);
> +        assertEquals(10, o2[0]);
> +        assertEquals(20, o2[1]);
> +    }
>  }
>
>
>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter