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);
}
}