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 2019/12/03 16:32:57 UTC

[myfaces] branch 2.3.x updated: MYFACES-4311 Generic Converter/Validator Fix

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

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


The following commit(s) were added to refs/heads/2.3.x by this push:
     new b2c4747  MYFACES-4311 Generic Converter/Validator Fix
     new 76326e6  Merge pull request #75 from volosied/Converter-Generic-Fix
b2c4747 is described below

commit b2c47476da47dac6f54eee65a3ef0cf404938af1
Author: Volodymyr Siedlecki <si...@volodymyrs-mbp.raleigh.ibm.com>
AuthorDate: Thu Nov 21 14:40:53 2019 -0500

    MYFACES-4311 Generic Converter/Validator Fix
---
 .../cdi/converter/FacesConverterCDIWrapper.java    | 31 +++++++++++++++++-----
 .../java/org/apache/myfaces/cdi/util/CDIUtils.java | 22 +++++++++++++++
 .../cdi/validator/FacesValidatorCDIWrapper.java    | 21 ++++++++++++---
 3 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/cdi/converter/FacesConverterCDIWrapper.java b/impl/src/main/java/org/apache/myfaces/cdi/converter/FacesConverterCDIWrapper.java
index 1126a32..3152afd 100644
--- a/impl/src/main/java/org/apache/myfaces/cdi/converter/FacesConverterCDIWrapper.java
+++ b/impl/src/main/java/org/apache/myfaces/cdi/converter/FacesConverterCDIWrapper.java
@@ -19,6 +19,10 @@
 
 package org.apache.myfaces.cdi.converter;
 
+import java.lang.reflect.Type;
+
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.util.TypeLiteral;
 import javax.faces.FacesWrapper;
 import javax.faces.component.PartialStateHolder;
 import javax.faces.component.UIComponent;
@@ -38,6 +42,9 @@ public class FacesConverterCDIWrapper implements PartialStateHolder, Converter,
     private Class<?> forClass;
     private String converterId;
     private boolean _transient;
+    private static final Type CONVERTER_TYPE = new TypeLiteral<Converter<?>>() { 
+        private static final long serialVersionUID = 1L; 
+    }.getType(); 
 
     public FacesConverterCDIWrapper()
     {
@@ -67,17 +74,29 @@ public class FacesConverterCDIWrapper implements PartialStateHolder, Converter,
     {
         if (delegate == null)
         {
+
+            BeanManager  beanManager = CDIUtils.getBeanManager(FacesContext.getCurrentInstance().getExternalContext());
+            FacesConverterAnnotationLiteral qualifier;
+
             if (converterId != null)
             {
-                delegate = (Converter) CDIUtils.getInstance(CDIUtils.getBeanManager(
-                    FacesContext.getCurrentInstance().getExternalContext()), 
-                        Converter.class, true, new FacesConverterAnnotationLiteral(Object.class, converterId, true));
+                qualifier = new FacesConverterAnnotationLiteral(Object.class, converterId, true);
+                delegate = (Converter) CDIUtils.getInstance(beanManager, CONVERTER_TYPE, true, qualifier);
+
+                if( delegate == null )
+                {
+                    delegate = (Converter) CDIUtils.getInstance(beanManager, Converter.class, true, qualifier);
+                }
             }
             else if (forClass != null)
             {
-                delegate = (Converter) CDIUtils.getInstance(CDIUtils.getBeanManager(
-                    FacesContext.getCurrentInstance().getExternalContext()), 
-                        Converter.class, true, new FacesConverterAnnotationLiteral(forClass, "", true));
+                qualifier = new FacesConverterAnnotationLiteral(forClass, "", true);
+                delegate = (Converter) CDIUtils.getInstance(beanManager, CONVERTER_TYPE, true, qualifier);
+
+                if( delegate == null )
+                {  
+                    delegate = (Converter) CDIUtils.getInstance(beanManager, Converter.class, true, qualifier);
+                }
             }
         }
         return delegate;
diff --git a/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java b/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java
index e6fd568..291cad3 100644
--- a/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java
+++ b/impl/src/main/java/org/apache/myfaces/cdi/util/CDIUtils.java
@@ -83,6 +83,14 @@ public class CDIUtils
         return (Bean<T>) beanManager.resolve(beans);
     }
 
+    @SuppressWarnings("unchecked")
+    public static <T> Bean<T> resolve(BeanManager beanManager, Type type, Annotation... qualifiers)
+    {
+        Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers);
+
+        return (Bean<T>) beanManager.resolve(beans);
+    }
+
     public static <T> T getInstance(BeanManager beanManager, Class<T> beanClass, 
             boolean create, Annotation... qualifiers)
     {
@@ -97,6 +105,20 @@ public class CDIUtils
         }
     }
 
+    public static <T> T getInstance(BeanManager beanManager, Type type, 
+    boolean create, Annotation... qualifiers)
+    {
+        try
+        {
+            Bean<T> bean = resolve(beanManager, type, qualifiers);
+            return (bean != null) ? getInstance(beanManager, bean, create) : null;
+        }
+        catch (ContextNotActiveException e)
+        {
+            return null;
+        }
+    }
+
     public static <T> T getInstance(BeanManager beanManager, Bean<T> bean, boolean create)
     {
         Context context = beanManager.getContext(bean.getScope());
diff --git a/impl/src/main/java/org/apache/myfaces/cdi/validator/FacesValidatorCDIWrapper.java b/impl/src/main/java/org/apache/myfaces/cdi/validator/FacesValidatorCDIWrapper.java
index fabdc2e..7235d17 100644
--- a/impl/src/main/java/org/apache/myfaces/cdi/validator/FacesValidatorCDIWrapper.java
+++ b/impl/src/main/java/org/apache/myfaces/cdi/validator/FacesValidatorCDIWrapper.java
@@ -19,12 +19,17 @@
 
 package org.apache.myfaces.cdi.validator;
 
+import java.lang.reflect.Type;
+
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.util.TypeLiteral;
 import javax.faces.FacesWrapper;
 import javax.faces.component.PartialStateHolder;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.validator.Validator;
 import javax.faces.validator.ValidatorException;
+
 import org.apache.myfaces.cdi.util.CDIUtils;
 
 /**
@@ -36,6 +41,10 @@ public class FacesValidatorCDIWrapper implements PartialStateHolder, Validator,
     
     private String validatorId;
     private boolean _transient;
+    private static final Type VALIDATOR_TYPE = new TypeLiteral<Validator<?>>() 
+    { 
+        private static final long serialVersionUID = 1L; 
+    }.getType();
 
     public FacesValidatorCDIWrapper()
     {
@@ -57,9 +66,15 @@ public class FacesValidatorCDIWrapper implements PartialStateHolder, Validator,
     {
         if (delegate == null)
         {
-            delegate = (Validator) CDIUtils.getInstance(CDIUtils.getBeanManager(
-                FacesContext.getCurrentInstance().getExternalContext()), 
-                    Validator.class, true, new FacesValidatorAnnotationLiteral(validatorId, false, true));
+            BeanManager  beanManager = CDIUtils.getBeanManager(FacesContext.getCurrentInstance().getExternalContext());
+            FacesValidatorAnnotationLiteral qualifier = new FacesValidatorAnnotationLiteral(validatorId, false, true);
+
+            delegate = (Validator) CDIUtils.getInstance(beanManager,VALIDATOR_TYPE, true, qualifier);
+ 
+            if(delegate == null)
+            {
+                delegate = (Validator) CDIUtils.getInstance(beanManager, Validator.class, true, qualifier);
+            }
         }
         return delegate;
     }