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