You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2013/10/24 23:37:00 UTC

svn commit: r1535562 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: application/ApplicationImpl.java cdi/util/CDIExternalArtifactResolver.java cdi/util/ExternalArtifactResolver.java

Author: lu4242
Date: Thu Oct 24 21:37:00 2013
New Revision: 1535562

URL: http://svn.apache.org/r1535562
Log:
MYFACES-3797 cdi support for converters and validators (fix classloading issue with CDI)

Added:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/CDIExternalArtifactResolver.java   (with props)
Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/ExternalArtifactResolver.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java?rev=1535562&r1=1535561&r2=1535562&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java Thu Oct 24 21:37:00 2013
@@ -110,6 +110,7 @@ import org.apache.myfaces.flow.FlowHandl
 import org.apache.myfaces.lifecycle.LifecycleImpl;
 import org.apache.myfaces.shared.config.MyfacesConfig;
 import org.apache.myfaces.shared.util.ClassUtils;
+import org.apache.myfaces.util.ExternalSpecifications;
 import org.apache.myfaces.view.facelets.FaceletCompositionContext;
 import org.apache.myfaces.view.facelets.el.ELText;
 
@@ -228,6 +229,8 @@ public class ApplicationImpl extends App
     /** Value of javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE parameter */
     private boolean _dateTimeConverterDefaultTimeZoneIsSystemTimeZone = false; 
     
+    private final ExternalArtifactResolver _externalArtifactResolver;
+    
     /**
      * Represents semantic null in _componentClassMap. 
      */
@@ -284,6 +287,17 @@ public class ApplicationImpl extends App
         {
             _dateTimeConverterDefaultTimeZoneIsSystemTimeZone = true;
         }
+        
+        if (ExternalSpecifications.isCDIAvailable(getFaceContext().getExternalContext()))
+        {
+            _externalArtifactResolver = (ExternalArtifactResolver) 
+                ClassUtils.newInstance(
+                    "org.apache.myfaces.cdi.util.CDIExternalArtifactResolver");
+        }
+        else
+        {
+            _externalArtifactResolver = null;
+        }
     }
 
     // ~ Methods
@@ -1537,7 +1551,8 @@ public class ApplicationImpl extends App
     private Converter createConverterInstance(Class<? extends Converter> converterClass)
             throws InstantiationException, IllegalAccessException
     {
-        Converter result = ExternalArtifactResolver.resolveManagedConverter(converterClass);
+        Converter result = _externalArtifactResolver != null ? 
+            _externalArtifactResolver.resolveManagedConverter(converterClass) : null;
 
         if (result == null)
         {
@@ -2024,7 +2039,8 @@ public class ApplicationImpl extends App
     private Validator createValidatorInstance(Class<? extends Validator> validatorClass)
             throws InstantiationException, IllegalAccessException
     {
-        Validator result = ExternalArtifactResolver.resolveManagedValidator(validatorClass);
+        Validator result = _externalArtifactResolver != null ? 
+            _externalArtifactResolver.resolveManagedValidator(validatorClass) : null;
 
         if (result == null)
         {

Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/CDIExternalArtifactResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/CDIExternalArtifactResolver.java?rev=1535562&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/CDIExternalArtifactResolver.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/CDIExternalArtifactResolver.java Thu Oct 24 21:37:00 2013
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.cdi.util;
+
+import java.util.Set;
+import javax.enterprise.context.Dependent;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.validator.Validator;
+import org.apache.myfaces.cdi.dependent.AbstractBeanStorage;
+import org.apache.myfaces.cdi.dependent.DependentBeanEntry;
+import org.apache.myfaces.cdi.dependent.RequestDependentBeanStorage;
+import org.apache.myfaces.shared.config.MyfacesConfig;
+import org.apache.myfaces.util.ExternalSpecifications;
+
+/**
+ *
+ */
+public class CDIExternalArtifactResolver extends ExternalArtifactResolver
+{
+    public static final String JAVAX_FACES_CONVERT_PACKAGE_NAME = "javax.faces.convert";
+    public static final String JAVAX_FACES_VALIDATOR_PACKAGE_NAME = "javax.faces.validator";
+
+    private Boolean managedConvertersEnabled;
+    private Boolean managedValidatorsEnabled;
+
+    public CDIExternalArtifactResolver()
+    {
+        initConverterInjectionEnabled();
+        initValidatorInjectionEnabled();
+    }
+    private boolean isManagedConvertersEnabled()
+    {
+        if (managedConvertersEnabled != null)
+        {
+            return managedConvertersEnabled;
+        }
+
+        //initConverterInjectionEnabled();
+        return managedConvertersEnabled;
+    }
+
+    private void initConverterInjectionEnabled()
+    {
+        if (managedConvertersEnabled != null)
+        {
+            return;
+        }
+
+        managedConvertersEnabled = MyfacesConfig.getCurrentInstance(
+                FacesContext.getCurrentInstance().getExternalContext()).isCdiManagedConvertersEnabled();
+    }
+
+    public Converter resolveManagedConverter(Class<? extends Converter> converterClass)
+    {
+        if (!isManagedConvertersEnabled())
+        {
+            return null;
+        }
+
+        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
+        if (!ExternalSpecifications.isCDIAvailable(externalContext) ||
+                JAVAX_FACES_CONVERT_PACKAGE_NAME.equals(converterClass.getPackage().getName()))
+        {
+            return null;
+        }
+
+        BeanManager beanManager = CDIUtils.getBeanManager(externalContext);
+
+        return getContextualReference(beanManager, converterClass);
+    }
+
+    private boolean isManagedValidatorsEnabled()
+    {
+        if (managedValidatorsEnabled != null)
+        {
+            return managedValidatorsEnabled;
+        }
+
+        //initValidatorInjectionEnabled();
+        return managedValidatorsEnabled;
+    }
+
+    private void initValidatorInjectionEnabled()
+    {
+        if (managedValidatorsEnabled != null)
+        {
+            return;
+        }
+
+        managedValidatorsEnabled = MyfacesConfig.getCurrentInstance(
+                FacesContext.getCurrentInstance().getExternalContext()).isCdiManagedValidatorsEnabled();
+    }
+
+    public Validator resolveManagedValidator(Class<? extends Validator> validatorClass)
+    {
+        if (!isManagedValidatorsEnabled())
+        {
+            return null;
+        }
+
+        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
+        if (!ExternalSpecifications.isCDIAvailable(externalContext) ||
+                JAVAX_FACES_VALIDATOR_PACKAGE_NAME.equals(validatorClass.getPackage().getName()))
+        {
+            return null;
+        }
+
+        BeanManager beanManager = CDIUtils.getBeanManager(externalContext);
+
+        return getContextualReference(beanManager, validatorClass);
+    }
+
+    private static <T> T getContextualReference(BeanManager beanManager, Class<T> type)
+    {
+        Set<Bean<?>> beans = beanManager.getBeans(type);
+
+        if (beans == null || beans.isEmpty())
+        {
+            return null;
+        }
+
+        Bean<?> bean = beanManager.resolve(beans);
+
+        CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
+
+        @SuppressWarnings({ "unchecked", "UnnecessaryLocalVariable" })
+        T result = (T) beanManager.getReference(bean, type, creationalContext);
+
+        if (bean.getScope().equals(Dependent.class))
+        {
+            //TODO add serializable check again or remove this TODO once MYFACES-3805 is clarified
+            AbstractBeanStorage beanStorage = getContextualReference(beanManager, RequestDependentBeanStorage.class);
+
+            //noinspection unchecked
+            beanStorage.add(new DependentBeanEntry(result, bean, creationalContext));
+        }
+
+        return result;
+    }
+}

Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/CDIExternalArtifactResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/ExternalArtifactResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/ExternalArtifactResolver.java?rev=1535562&r1=1535561&r2=1535562&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/ExternalArtifactResolver.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/util/ExternalArtifactResolver.java Thu Oct 24 21:37:00 2013
@@ -18,137 +18,16 @@
  */
 package org.apache.myfaces.cdi.util;
 
-import org.apache.myfaces.cdi.dependent.AbstractBeanStorage;
-import org.apache.myfaces.cdi.dependent.DependentBeanEntry;
-import org.apache.myfaces.cdi.dependent.RequestDependentBeanStorage;
-import org.apache.myfaces.shared.config.MyfacesConfig;
-import org.apache.myfaces.util.ExternalSpecifications;
-
-import javax.enterprise.context.Dependent;
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.faces.context.ExternalContext;
-import javax.faces.context.FacesContext;
 import javax.faces.convert.Converter;
 import javax.faces.validator.Validator;
-import java.util.Set;
 
-public class ExternalArtifactResolver
+/**
+ * This class is a thin layer to isolate CDI specific API from JSF. In this way
+ * JSF can work without CDI. 
+ */
+public abstract class ExternalArtifactResolver
 {
-    public static final String JAVAX_FACES_CONVERT_PACKAGE_NAME = "javax.faces.convert";
-    public static final String JAVAX_FACES_VALIDATOR_PACKAGE_NAME = "javax.faces.validator";
-
-    private static volatile Boolean managedConvertersEnabled;
-    private static volatile Boolean managedValidatorsEnabled;
-
-    private static boolean isManagedConvertersEnabled()
-    {
-        if (managedConvertersEnabled != null)
-        {
-            return managedConvertersEnabled;
-        }
-
-        initConverterInjectionEnabled();
-        return managedConvertersEnabled;
-    }
-
-    private static synchronized void initConverterInjectionEnabled()
-    {
-        if (managedConvertersEnabled != null)
-        {
-            return;
-        }
-
-        managedConvertersEnabled = MyfacesConfig.getCurrentInstance(
-                FacesContext.getCurrentInstance().getExternalContext()).isCdiManagedConvertersEnabled();
-    }
-
-    public static Converter resolveManagedConverter(Class<? extends Converter> converterClass)
-    {
-        if (!isManagedConvertersEnabled())
-        {
-            return null;
-        }
-
-        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
-        if (!ExternalSpecifications.isCDIAvailable(externalContext) ||
-                JAVAX_FACES_CONVERT_PACKAGE_NAME.equals(converterClass.getPackage().getName()))
-        {
-            return null;
-        }
-
-        BeanManager beanManager = CDIUtils.getBeanManager(externalContext);
-
-        return getContextualReference(beanManager, converterClass);
-    }
-
-    private static boolean isManagedValidatorsEnabled()
-    {
-        if (managedValidatorsEnabled != null)
-        {
-            return managedValidatorsEnabled;
-        }
-
-        initValidatorInjectionEnabled();
-        return managedValidatorsEnabled;
-    }
-
-    private static synchronized void initValidatorInjectionEnabled()
-    {
-        if (managedValidatorsEnabled != null)
-        {
-            return;
-        }
-
-        managedValidatorsEnabled = MyfacesConfig.getCurrentInstance(
-                FacesContext.getCurrentInstance().getExternalContext()).isCdiManagedValidatorsEnabled();
-    }
-
-    public static Validator resolveManagedValidator(Class<? extends Validator> validatorClass)
-    {
-        if (!isManagedValidatorsEnabled())
-        {
-            return null;
-        }
-
-        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
-        if (!ExternalSpecifications.isCDIAvailable(externalContext) ||
-                JAVAX_FACES_VALIDATOR_PACKAGE_NAME.equals(validatorClass.getPackage().getName()))
-        {
-            return null;
-        }
-
-        BeanManager beanManager = CDIUtils.getBeanManager(externalContext);
-
-        return getContextualReference(beanManager, validatorClass);
-    }
-
-    private static <T> T getContextualReference(BeanManager beanManager, Class<T> type)
-    {
-        Set<Bean<?>> beans = beanManager.getBeans(type);
-
-        if (beans == null || beans.isEmpty())
-        {
-            return null;
-        }
-
-        Bean<?> bean = beanManager.resolve(beans);
-
-        CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
-
-        @SuppressWarnings({ "unchecked", "UnnecessaryLocalVariable" })
-        T result = (T) beanManager.getReference(bean, type, creationalContext);
-
-        if (bean.getScope().equals(Dependent.class))
-        {
-            //TODO add serializable check again or remove this TODO once MYFACES-3805 is clarified
-            AbstractBeanStorage beanStorage = getContextualReference(beanManager, RequestDependentBeanStorage.class);
-
-            //noinspection unchecked
-            beanStorage.add(new DependentBeanEntry(result, bean, creationalContext));
-        }
-
-        return result;
-    }
+    public abstract Converter resolveManagedConverter(Class<? extends Converter> converterClass);
+    
+    public abstract Validator resolveManagedValidator(Class<? extends Validator> validatorClass);
 }