You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2020/11/05 11:59:48 UTC

[commons-jexl] branch master updated (d70e659 -> eaa7a94)

This is an automated email from the ASF dual-hosted git repository.

henrib pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git.


    from d70e659  Jacoco uses the config in the build section
     new d5adda7  JEXL: Java 8 and formatting
     new eaa7a94  JEXL-337: JaCoCo check limits, doxia docs warning fixes

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            | 21 +++++
 .../jexl3/internal/introspection/ClassMap.java     | 45 +++++-----
 .../commons/jexl3/introspection/JexlUberspect.java | 96 ++++++++++------------
 src/site/xdoc/changes.xml                          |  2 +-
 src/site/xdoc/reference/syntax.xml                 |  8 +-
 5 files changed, 97 insertions(+), 75 deletions(-)


[commons-jexl] 01/02: JEXL: Java 8 and formatting

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit d5adda773a5df0decdcffb3d4419b8d428849e2b
Author: henrib <he...@apache.org>
AuthorDate: Thu Nov 5 11:18:10 2020 +0100

    JEXL: Java 8 and formatting
---
 .../jexl3/internal/introspection/ClassMap.java     | 45 +++++-----
 .../commons/jexl3/introspection/JexlUberspect.java | 96 ++++++++++------------
 2 files changed, 71 insertions(+), 70 deletions(-)

diff --git a/src/main/java/org/apache/commons/jexl3/internal/introspection/ClassMap.java b/src/main/java/org/apache/commons/jexl3/internal/introspection/ClassMap.java
index 43b9f02..002366f 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/introspection/ClassMap.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/introspection/ClassMap.java
@@ -39,6 +39,7 @@ import java.util.concurrent.ConcurrentMap;
  * <p>
  * Originally taken from the Velocity tree so we can be self-sufficient.
  * </p>
+ *
  * @see MethodKey
  * @since 1.0
  */
@@ -46,6 +47,7 @@ final class ClassMap {
     /**
      * A method that returns itself used as a marker for cache miss,
      * allows the underlying cache map to be strongly typed.
+     *
      * @return itself as a method
      */
     public static Method cacheMiss() {
@@ -57,7 +59,9 @@ final class ClassMap {
         }
     }
 
-    /** The cache miss marker method. */
+    /**
+     * The cache miss marker method.
+     */
     private static final Method CACHE_MISS = cacheMiss();
     /**
      * This is the cache to store and look up the method information.
@@ -73,11 +77,11 @@ final class ClassMap {
      * </p>
      * Uses ConcurrentMap since 3.0, marginally faster than 2.1 under contention.
      */
-    private final ConcurrentMap<MethodKey, Method> byKey = new ConcurrentHashMap<MethodKey, Method>();
+    private final ConcurrentMap<MethodKey, Method> byKey = new ConcurrentHashMap<>();
     /**
      * Keep track of all methods with the same name; this is not modified after creation.
      */
-    private final Map<String, Method[]> byName = new HashMap<String, Method[]>();
+    private final Map<String, Method[]> byName = new HashMap<>();
     /**
      * Cache of fields.
      */
@@ -86,9 +90,9 @@ final class ClassMap {
     /**
      * Standard constructor.
      *
-     * @param aClass the class to deconstruct.
+     * @param aClass      the class to deconstruct.
      * @param permissions the permissions to apply during introspection
-     * @param log    the logger.
+     * @param log         the logger.
      */
     @SuppressWarnings("LeakingThisInConstructor")
     ClassMap(Class<?> aClass, Permissions permissions, Log log) {
@@ -97,7 +101,7 @@ final class ClassMap {
         // eagerly cache public fields
         Field[] fields = aClass.getFields();
         if (fields.length > 0) {
-            Map<String, Field> cache = new HashMap<String, Field>();
+            Map<String, Field> cache = new HashMap<>();
             for (Field field : fields) {
                 if (permissions.allow(field)) {
                     cache.put(field.getName(), field);
@@ -111,6 +115,7 @@ final class ClassMap {
 
     /**
      * Find a Field using its name.
+     *
      * @param fname the field name
      * @return A Field object representing the field to invoke or null.
      */
@@ -120,6 +125,7 @@ final class ClassMap {
 
     /**
      * Gets the field names cached by this map.
+     *
      * @return the array of field names
      */
     String[] getFieldNames() {
@@ -128,6 +134,7 @@ final class ClassMap {
 
     /**
      * Gets the methods names cached by this map.
+     *
      * @return the array of method names
      */
     String[] getMethodNames() {
@@ -136,6 +143,7 @@ final class ClassMap {
 
     /**
      * Gets all the methods with a given name from this map.
+     *
      * @param methodName the seeked methods name
      * @return the array of methods (null or non-empty)
      */
@@ -160,6 +168,7 @@ final class ClassMap {
      * If nothing is found, then we must actually go
      * and introspect the method from the MethodMap.
      * </p>
+     *
      * @param methodKey the method key
      * @return A Method object representing the method to invoke or null.
      * @throws MethodKey.AmbiguousException When more than one method is a match for the parameters.
@@ -196,6 +205,7 @@ final class ClassMap {
     /**
      * Populate the Map of direct hits. These are taken from all the public methods
      * that our class, its parents and their implemented interfaces provide.
+     *
      * @param cache          the ClassMap instance we create
      * @param permissions    the permissions to apply during introspection
      * @param classToReflect the class to cache
@@ -221,15 +231,10 @@ final class ClassMap {
         }
         // now that we've got all methods keyed in, lets organize them by name
         if (!cache.byKey.isEmpty()) {
-            List<Method> lm = new ArrayList<Method>(cache.byKey.size());
+            List<Method> lm = new ArrayList<>(cache.byKey.size());
             lm.addAll(cache.byKey.values());
             // sort all methods by name
-            lm.sort(new Comparator<Method>() {
-                @Override
-                public int compare(Method o1, Method o2) {
-                    return o1.getName().compareTo(o2.getName());
-                }
-            });
+            lm.sort(Comparator.comparing(Method::getName));
             // put all lists of methods with same name in byName cache
             int start = 0;
             while (start < lm.size()) {
@@ -252,10 +257,11 @@ final class ClassMap {
 
     /**
      * Recurses up interface hierarchy to get all super interfaces.
-     * @param cache the cache to fill
+     *
+     * @param cache       the cache to fill
      * @param permissions the permissions to apply during introspection
-     * @param iface the interface to populate the cache from
-     * @param log   the Log
+     * @param iface       the interface to populate the cache from
+     * @param log         the Log
      */
     private static void populateWithInterface(ClassMap cache, Permissions permissions, Class<?> iface, Log log) {
         if (Modifier.isPublic(iface.getModifiers())) {
@@ -269,10 +275,11 @@ final class ClassMap {
 
     /**
      * Recurses up class hierarchy to get all super classes.
-     * @param cache the cache to fill
+     *
+     * @param cache       the cache to fill
      * @param permissions the permissions to apply during introspection
-     * @param clazz the class to populate the cache from
-     * @param log   the Log
+     * @param clazz       the class to populate the cache from
+     * @param log         the Log
      */
     private static void populateWithClass(ClassMap cache, Permissions permissions, Class<?> clazz, Log log) {
         try {
diff --git a/src/main/java/org/apache/commons/jexl3/introspection/JexlUberspect.java b/src/main/java/org/apache/commons/jexl3/introspection/JexlUberspect.java
index 41e014c..362fca8 100644
--- a/src/main/java/org/apache/commons/jexl3/introspection/JexlUberspect.java
+++ b/src/main/java/org/apache/commons/jexl3/introspection/JexlUberspect.java
@@ -39,7 +39,7 @@ public interface JexlUberspect {
      * These are used through 'strategies' to solve properties; a strategy orders a list of resolver types,
      * and each resolver type is tried in sequence; the first resolver that discovers a non null {s,g}etter
      * stops the search.
-     * 
+     *
      * @see JexlResolver
      * @see JexlUberspect#getPropertyGet
      * @see JexlUberspect#getPropertySet
@@ -49,7 +49,7 @@ public interface JexlUberspect {
 
         /**
          * Gets a property getter.
-         * 
+         *
          * @param uber       the uberspect
          * @param obj        the object
          * @param identifier the property identifier
@@ -59,7 +59,7 @@ public interface JexlUberspect {
 
         /**
          * Gets a property setter.
-         * 
+         *
          * @param uber       the uberspect
          * @param obj        the object
          * @param identifier the property identifier
@@ -74,7 +74,7 @@ public interface JexlUberspect {
      * <p>
      * Each resolver discovers how to set/get a property with different techniques; seeking
      * method names or field names, etc.
-     * 
+     *
      * @since 3.0
      */
     enum JexlResolver implements PropertyResolver {
@@ -98,19 +98,19 @@ public interface JexlUberspect {
 
         @Override
         public final JexlPropertyGet getPropertyGet(JexlUberspect uber, Object obj, Object identifier) {
-            return uber.getPropertyGet(Collections.<PropertyResolver>singletonList(this), obj, identifier);
+            return uber.getPropertyGet(Collections.singletonList(this), obj, identifier);
         }
 
         @Override
         public final JexlPropertySet getPropertySet(JexlUberspect uber, Object obj, Object identifier, Object arg) {
-            return uber.getPropertySet(Collections.<PropertyResolver>singletonList(this), obj, identifier, arg);
+            return uber.getPropertySet(Collections.singletonList(this), obj, identifier, arg);
         }
     }
 
     /**
      * A resolver types list tailored for POJOs, favors '.' over '[]'.
      */
-    List<PropertyResolver> POJO = Collections.<PropertyResolver>unmodifiableList(Arrays.asList(
+    List<PropertyResolver> POJO = Collections.unmodifiableList(Arrays.asList(
             JexlResolver.PROPERTY,
             JexlResolver.MAP,
             JexlResolver.LIST,
@@ -122,7 +122,7 @@ public interface JexlUberspect {
     /**
      * A resolver types list tailored for Maps, favors '[]' over '.'.
      */
-    List<PropertyResolver> MAP = Collections.<PropertyResolver>unmodifiableList(Arrays.asList(
+    List<PropertyResolver> MAP = Collections.unmodifiableList(Arrays.asList(
             JexlResolver.MAP,
             JexlResolver.LIST,
             JexlResolver.DUCK,
@@ -133,19 +133,19 @@ public interface JexlUberspect {
 
     /**
      * Determines property resolution strategy.
-     * 
+     *
      * <p>To use a strategy instance, you have to set it at engine creation using
      * {@link org.apache.commons.jexl3.JexlBuilder#strategy(JexlUberspect.ResolverStrategy)}
      * as in:</p>
-     * 
+     *
      * <code>JexlEngine jexl = new JexlBuilder().strategy(MY_STRATEGY).create();</code>
-     * 
+     *
      * @since 3.0
      */
     interface ResolverStrategy {
         /**
          * Applies this strategy to a list of resolver types.
-         * 
+         *
          * @param operator the property access operator, may be null
          * @param obj      the instance we seek to obtain a property setter/getter from, can not be null
          * @return the ordered list of resolvers types, must not be null
@@ -159,47 +159,41 @@ public interface JexlUberspect {
      * If the operator is '[]' or if the operator is null and the object is a map, use the MAP list of resolvers;
      * Other cases use the POJO list of resolvers.
      */
-    ResolverStrategy JEXL_STRATEGY = new ResolverStrategy() {
-        @Override
-        public List<PropertyResolver> apply(JexlOperator op, Object obj) {
-            if (op == JexlOperator.ARRAY_GET) {
-                return MAP;
-            }
-            if (op == JexlOperator.ARRAY_SET) {
-                return MAP;
-            }
-            if (op == null && obj instanceof Map) {
-                return MAP;
-            }
-            return POJO;
+    ResolverStrategy JEXL_STRATEGY = (op, obj) -> {
+        if (op == JexlOperator.ARRAY_GET) {
+            return MAP;
         }
+        if (op == JexlOperator.ARRAY_SET) {
+            return MAP;
+        }
+        if (op == null && obj instanceof Map) {
+            return MAP;
+        }
+        return POJO;
     };
 
     /**
      * The map strategy.
-     * 
+     *
      * <p>If the operator is '[]' or if the object is a map, use the MAP list of resolvers.
      * Otherwise, use the POJO list of resolvers.</p>
      */
-    ResolverStrategy MAP_STRATEGY = new ResolverStrategy() {
-        @Override
-        public List<PropertyResolver> apply(JexlOperator op, Object obj) {
-            if (op == JexlOperator.ARRAY_GET) {
-                return MAP;
-            }
-            if (op == JexlOperator.ARRAY_SET) {
-                return MAP;
-            }
-            if (obj instanceof Map) {
-                return MAP;
-            }
-            return POJO;
+    ResolverStrategy MAP_STRATEGY = (op, obj) -> {
+        if (op == JexlOperator.ARRAY_GET) {
+            return MAP;
+        }
+        if (op == JexlOperator.ARRAY_SET) {
+            return MAP;
+        }
+        if (obj instanceof Map) {
+            return MAP;
         }
+        return POJO;
     };
 
     /**
      * Applies this uberspect property resolver strategy.
-     * 
+     *
      * @param op the operator
      * @param obj the object
      * @return the applied strategy resolver list
@@ -208,13 +202,13 @@ public interface JexlUberspect {
 
     /**
      * Sets the class loader to use.
-     * 
+     *
      * <p>This increments the version.</p>
-     * 
+     *
      * @param loader the class loader
      */
     void setClassLoader(ClassLoader loader);
-    
+
     /**
      * Gets the current class loader.
      * @return the class loader
@@ -223,14 +217,14 @@ public interface JexlUberspect {
 
     /**
      * Gets this uberspect version.
-     * 
+     *
      * @return the class loader modification count
      */
     int getVersion();
 
     /**
      * Returns a class constructor.
-     * 
+     *
      * @param ctorHandle a class or class name
      * @param args       constructor arguments
      * @return a {@link JexlMethod}
@@ -240,7 +234,7 @@ public interface JexlUberspect {
 
     /**
      * Returns a JexlMethod.
-     * 
+     *
      * @param obj    the object
      * @param method the method name
      * @param args   method arguments
@@ -250,9 +244,9 @@ public interface JexlUberspect {
 
     /**
      * Property getter.
-     * 
+     *
      * <p>returns a JelPropertySet apropos to an expression like <code>bar.woogie</code>.</p>
-     * 
+     *
      * @param obj        the object to get the property from
      * @param identifier property name
      * @return a {@link JexlPropertyGet} or null
@@ -277,7 +271,7 @@ public interface JexlUberspect {
      * Property setter.
      * <p>
      * Seeks a JelPropertySet apropos to an expression like  <code>foo.bar = "geir"</code>.</p>
-     * 
+     *
      * @param obj        the object to get the property from.
      * @param identifier property name
      * @param arg        value to set
@@ -302,7 +296,7 @@ public interface JexlUberspect {
 
     /**
      * Gets an iterator from an object.
-     * 
+     *
      * @param obj to get the iterator from
      * @return an iterator over obj or null
      */
@@ -310,7 +304,7 @@ public interface JexlUberspect {
 
     /**
      * Gets an arithmetic operator resolver for a given arithmetic instance.
-     * 
+     *
      * @param arithmetic the arithmetic instance
      * @return the arithmetic uberspect or null if no operator method were overridden
      * @since 3.0


[commons-jexl] 02/02: JEXL-337: JaCoCo check limits, doxia docs warning fixes

Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git

commit eaa7a94ee2d5f3b1f2714d4fb7f3e28095cc36dc
Author: henrib <he...@apache.org>
AuthorDate: Thu Nov 5 11:22:10 2020 +0100

    JEXL-337: JaCoCo check limits, doxia docs warning fixes
---
 pom.xml                            | 21 +++++++++++++++++++++
 src/site/xdoc/changes.xml          |  2 +-
 src/site/xdoc/reference/syntax.xml |  8 ++++----
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/pom.xml b/pom.xml
index 4b6b821..9543cf9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,6 +183,27 @@
                             <exclude>**/org/apache/commons/jexl3/parser/*.class</exclude>
                             <exclude>**/org/apache/commons/jexl3/**/*Test.class</exclude>
                     </excludes>
+                    <rules>
+                        <rule>
+                            <limits>
+                                <limit>
+                                    <counter>INSTRUCTION</counter>
+                                    <value>COVEREDRATIO</value>
+                                    <minimum>85.0%</minimum>
+                                </limit>
+                                <limit>
+                                    <counter>LINE</counter>
+                                    <value>COVEREDRATIO</value>
+                                    <minimum>0.75</minimum>
+                                </limit>
+                                <limit>
+                                    <counter>BRANCH</counter>
+                                    <value>COVEREDRATIO</value>
+                                    <minimum>0.75</minimum>
+                                </limit>
+                            </limits>
+                        </rule>
+                    </rules>
                 </configuration>
             </plugin>
 
diff --git a/src/site/xdoc/changes.xml b/src/site/xdoc/changes.xml
index e84010a..661e8a8 100644
--- a/src/site/xdoc/changes.xml
+++ b/src/site/xdoc/changes.xml
@@ -25,7 +25,7 @@
         <author email="dev@commons.apache.org">Commons Developers</author>
     </properties>
     <body>
-        <release version="3.2" date="unreleased">
+        <release version="3.2">
             <action dev="Hussachai Puripunpinyo" type="fix" issue="JEXL-336">
                 Escape some control characters
             </action>
diff --git a/src/site/xdoc/reference/syntax.xml b/src/site/xdoc/reference/syntax.xml
index bdae6d7..3b718df 100644
--- a/src/site/xdoc/reference/syntax.xml
+++ b/src/site/xdoc/reference/syntax.xml
@@ -133,14 +133,14 @@
                         <p>Pragma keys can be identifiers or antish names, pragma values can be literals (boolean, integer,
                             real, string, null, NaN) and antish names</p>
                         <p>Although pragmas are statements, they are <em>not</em> evaluated at runtime; they are constants
-                            associated to the script after parsing. It is expected that user code accesses the pragma map from 
+                            associated to the script after parsing. It is expected that user code accesses the pragma map from
                             scripts to alter some functions behavior.</p>
                         <p>The are two built-in pragmas:</p>
                         <p>
                             <b>jexl.options</b> overrides the evaluation options using the option-flags syntax.
                             <code>#pragma jexl.options "+strict -safe +lexical +lexicalShade"</code> will let the script run with
                             the options strict being true, safe false, lexical true and lexical-shade true.</p>
-                                
+
                         <p>
                             <b>jexl.namespace.<i>ns_prefix</i></b> declares a namespace valid for the script
                             execution lifetime, the value being the fully-qualified namespace class-name.
@@ -360,11 +360,11 @@
                         <code>'Hello world'</code> are equivalent.
                         <p>The escape character is <code>\</code> (backslash).
                         Unicode characters can be used in string literals;
-                            <lu>Unicode escape sequences consist of:
+                            <ul>Unicode escape sequences consist of:
                                 <li> a backslash '\' </li>
                                 <li>a 'u' </li>
                                 <li>4 hexadecimal digits ([0-9],[A-H],[a-h]).</li>
-                            </lu>
+                            </ul>
                             Such sequences represent the UTF-16 encoding of a Unicode character,
                             for example, <code>'a'</code> is equivalent to <code>'\u0061'</code>.
                         </p>