You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2020/07/06 21:54:16 UTC

[myfaces] branch master updated: MYFACES-4349

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

tandraschko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/master by this push:
     new f4e2b3f  MYFACES-4349
f4e2b3f is described below

commit f4e2b3f9d530e45f285412d61cda55639aa1f042
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Mon Jul 6 23:54:09 2020 +0200

    MYFACES-4349
---
 .../api/shared/lang/PropertyDescriptorUtils.java   | 58 +++++++++++++---------
 .../myfaces/application/ApplicationImpl.java       |  2 +-
 .../myfaces/el/resolver/LambdaBeanELResolver.java  | 27 +++++++---
 3 files changed, 56 insertions(+), 31 deletions(-)

diff --git a/api/src/main/java/org/apache/myfaces/core/api/shared/lang/PropertyDescriptorUtils.java b/api/src/main/java/org/apache/myfaces/core/api/shared/lang/PropertyDescriptorUtils.java
index 0578f67..61ccade 100644
--- a/api/src/main/java/org/apache/myfaces/core/api/shared/lang/PropertyDescriptorUtils.java
+++ b/api/src/main/java/org/apache/myfaces/core/api/shared/lang/PropertyDescriptorUtils.java
@@ -36,12 +36,16 @@ import java.util.function.Function;
 import java.util.function.ObjDoubleConsumer;
 import java.util.function.ObjIntConsumer;
 import java.util.function.ObjLongConsumer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import javax.faces.FacesException;
 import javax.faces.context.ExternalContext;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
 
 public class PropertyDescriptorUtils
 {
+    private static final Logger LOG = Logger.getLogger(PropertyDescriptorUtils.class.getName());
+
     /**
      * Defines if Lambda expressions (via LambdaMetafactory) are used for getter/setter instead of Reflection.
      */
@@ -83,8 +87,7 @@ public class PropertyDescriptorUtils
         Map<String, ? extends PropertyDescriptorWrapper> cache = getCache(ec).get(target.getName());
         if (cache == null)
         {
-            cache = getPropertyDescriptors(ec, target);
-            getCache(ec).put(target.getName(), cache);
+            cache = getCache(ec).computeIfAbsent(target.getName(), k -> getPropertyDescriptors(ec, target));
         }
 
         return cache;
@@ -107,7 +110,23 @@ public class PropertyDescriptorUtils
     {
         if (isUseLambdaMetafactory(ec))
         {
-            return getLambdaPropertyDescriptors(target);
+            try
+            {
+                return getLambdaPropertyDescriptors(target);
+            }
+            catch (IllegalAccessException e)
+            {
+                LOG.log(Level.INFO, 
+                        "Could not generate LambdaPropertyDescriptor for "
+                                + target.getName() + ". Use PropertyDescriptor...");
+            }
+            catch (Throwable e)
+            {
+                LOG.log(Level.INFO, 
+                        "Could not generate LambdaPropertyDescriptor for "
+                                + target.getName() + ". Use PropertyDescriptor...",
+                        e);
+            }
         }
 
         try
@@ -190,32 +209,25 @@ public class PropertyDescriptorUtils
         return lpd;
     }
     
-    public static Map<String, LambdaPropertyDescriptor> getLambdaPropertyDescriptors(Class<?> target)
+    public static Map<String, LambdaPropertyDescriptor> getLambdaPropertyDescriptors(Class<?> target) throws Throwable
     {
-        try
+        PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(target).getPropertyDescriptors();
+        if (propertyDescriptors == null || propertyDescriptors.length == 0)
         {
-            PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(target).getPropertyDescriptors();
-            if (propertyDescriptors == null || propertyDescriptors.length == 0)
-            {
-                return Collections.emptyMap();
-            }
+            return Collections.emptyMap();
+        }
 
-            Map<String, LambdaPropertyDescriptor> properties = new ConcurrentHashMap<>(propertyDescriptors.length);
+        Map<String, LambdaPropertyDescriptor> properties = new ConcurrentHashMap<>(propertyDescriptors.length);
 
-            MethodHandles.Lookup lookup = (MethodHandles.Lookup)
-                    privateLookupIn.invoke(null, target, MethodHandles.lookup());
-            for (PropertyDescriptor pd : Introspector.getBeanInfo(target).getPropertyDescriptors())
-            {
-                LambdaPropertyDescriptor lpd = createLambdaPropertyDescriptor(target, pd, lookup);
-                properties.put(pd.getName(), lpd);
-            }
-            
-            return properties;
-        }
-        catch (Throwable e)
+        MethodHandles.Lookup lookup = (MethodHandles.Lookup)
+                privateLookupIn.invoke(null, target, MethodHandles.lookup());
+        for (PropertyDescriptor pd : Introspector.getBeanInfo(target).getPropertyDescriptors())
         {
-            throw new FacesException(e);
+            LambdaPropertyDescriptor lpd = createLambdaPropertyDescriptor(target, pd, lookup);
+            properties.put(pd.getName(), lpd);
         }
+
+        return properties;
     }
 
     @SuppressWarnings("unchecked")
diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
index 310fd81..9bf8b0f 100755
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
@@ -1576,7 +1576,7 @@ public class ApplicationImpl extends Application
 
         if (converterConfig != null && !converterConfig.getProperties().isEmpty())
         {
-            Map<String, ? extends PropertyDescriptorWrapper> pds = PropertyDescriptorUtils.getPropertyDescriptors(
+            Map<String, ? extends PropertyDescriptorWrapper> pds = PropertyDescriptorUtils.getCachedPropertyDescriptors(
                     FacesContext.getCurrentInstance().getExternalContext(),
                     converterClass);
 
diff --git a/impl/src/main/java/org/apache/myfaces/el/resolver/LambdaBeanELResolver.java b/impl/src/main/java/org/apache/myfaces/el/resolver/LambdaBeanELResolver.java
index 7cf6a5c..a1459d6 100644
--- a/impl/src/main/java/org/apache/myfaces/el/resolver/LambdaBeanELResolver.java
+++ b/impl/src/main/java/org/apache/myfaces/el/resolver/LambdaBeanELResolver.java
@@ -68,7 +68,13 @@ public class LambdaBeanELResolver extends BeanELResolver
 
         try
         {
-            return getPropertyDescriptor(base, property).getReadFunction().apply(base);
+            PropertyDescriptorWrapper pd = getPropertyDescriptor(base, property);
+            if (pd instanceof LambdaPropertyDescriptor)
+            {
+                return ((LambdaPropertyDescriptor) pd).getReadFunction().apply(base);
+            }
+
+            return pd.getWrapped().getReadMethod().invoke(base);
         }
         catch (Exception e)
         {
@@ -88,8 +94,8 @@ public class LambdaBeanELResolver extends BeanELResolver
 
         context.setPropertyResolved(base, property);
 
-        LambdaPropertyDescriptor propertyDescriptor = getPropertyDescriptor(base, property);
-        if (propertyDescriptor.getWriteFunction() == null)
+        PropertyDescriptorWrapper pd = getPropertyDescriptor(base, property);
+        if (pd.getWrapped().getWriteMethod()== null)
         {
             throw new PropertyNotWritableException("Property \"" + (String) property
                     + "\" in \"" + base.getClass().getName() + "\" is not writable!");
@@ -97,7 +103,14 @@ public class LambdaBeanELResolver extends BeanELResolver
 
         try
         {
-            propertyDescriptor.getWriteFunction().accept(base, value);
+            if (pd instanceof LambdaPropertyDescriptor)
+            {
+                ((LambdaPropertyDescriptor) pd).getWriteFunction().accept(base, value);
+            }
+            else
+            {
+                pd.getWrapped().getWriteMethod().invoke(base, value);
+            }
         }
         catch (Exception e)
         {
@@ -116,7 +129,7 @@ public class LambdaBeanELResolver extends BeanELResolver
 
         context.setPropertyResolved(base, property);
 
-        return getPropertyDescriptor(base, property).getWriteFunction() == null;
+        return getPropertyDescriptor(base, property).getWrapped().getWriteMethod() == null;
     }
 
     @Override
@@ -130,7 +143,7 @@ public class LambdaBeanELResolver extends BeanELResolver
         return null;
     }
 
-    protected LambdaPropertyDescriptor getPropertyDescriptor(Object base, Object property)
+    protected PropertyDescriptorWrapper getPropertyDescriptor(Object base, Object property)
     {
         Map<String, ? extends PropertyDescriptorWrapper> beanCache = cache.get(base.getClass().getName());
         if (beanCache == null)
@@ -141,6 +154,6 @@ public class LambdaBeanELResolver extends BeanELResolver
             cache.put(base.getClass().getName(), beanCache);
         }
 
-        return (LambdaPropertyDescriptor) beanCache.get((String) property);
+        return beanCache.get((String) property);
     }
 }