You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ja...@apache.org on 2010/10/13 15:06:17 UTC
svn commit: r1022088 -
/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/PhaseListenerExtension.java
Author: jakobk
Date: Wed Oct 13 13:06:17 2010
New Revision: 1022088
URL: http://svn.apache.org/viewvc?rev=1022088&view=rev
Log:
EXTCDI-10 phase listener annotation (instantiate PhaseListeners when FacesContext is available)
Modified:
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/PhaseListenerExtension.java
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/PhaseListenerExtension.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/PhaseListenerExtension.java?rev=1022088&r1=1022087&r2=1022088&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/PhaseListenerExtension.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/PhaseListenerExtension.java Wed Oct 13 13:06:17 2010
@@ -18,24 +18,24 @@
*/
package org.apache.myfaces.extensions.cdi.jsf.impl.listener.phase;
-import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfPhaseListener;
-import org.apache.myfaces.extensions.cdi.jsf.impl.util.JsfUtils;
import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
-import static org.apache.myfaces.extensions.cdi.core.impl.utils.ClassDeactivation.isClassActivated;
import org.apache.myfaces.extensions.cdi.core.impl.InvocationOrderComparator;
-import static org.apache.myfaces.extensions.cdi.core.impl.utils.CodiUtils.tryToInjectDependencies;
+import org.apache.myfaces.extensions.cdi.jsf.api.listener.phase.JsfPhaseListener;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.faces.event.PhaseListener;
-import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import static org.apache.myfaces.extensions.cdi.core.impl.utils.ClassDeactivation.isClassActivated;
+import static org.apache.myfaces.extensions.cdi.core.impl.utils.CodiUtils.tryToInjectDependencies;
+
/**
* The PhaseListenerExtension picks up all {@link JsfPhaseListener} annotated
* beans for later registration as PhaseListeners.
@@ -45,69 +45,62 @@ import java.util.concurrent.CopyOnWriteA
*/
public class PhaseListenerExtension implements Extension
{
- private static Map<ClassLoader, List<PhaseListener>> phaseListeners =
- new ConcurrentHashMap<ClassLoader,List<PhaseListener>>();
+ private static Map<ClassLoader, List<Class<? extends PhaseListener>>> phaseListeners =
+ new ConcurrentHashMap<ClassLoader,List<Class<? extends PhaseListener>>>();
public void filterJsfPhaseListeners(@Observes ProcessAnnotatedType processAnnotatedType)
{
if (processAnnotatedType.getAnnotatedType().isAnnotationPresent(JsfPhaseListener.class))
{
- if(isClassActivated(processAnnotatedType.getAnnotatedType().getJavaClass()))
+ Class<? extends PhaseListener> phaseListenerClass
+ = processAnnotatedType.getAnnotatedType().getJavaClass();
+
+ if(isClassActivated(phaseListenerClass))
{
- addPhaseListener(processAnnotatedType);
+ addPhaseListener(phaseListenerClass);
}
processAnnotatedType.veto();
}
}
- private void addPhaseListener(ProcessAnnotatedType processAnnotatedType)
- {
- PhaseListener newPhaseListener = createPhaseListenerInstance(processAnnotatedType);
-
- try
- {
- JsfUtils.registerPhaseListener(newPhaseListener);
- }
- catch (IllegalStateException e)
- {
- // current workaround some servers
- addPhaseListener(newPhaseListener);
- }
- }
-
- private void addPhaseListener(PhaseListener newPhaseListener)
+ private void addPhaseListener(Class<? extends PhaseListener> newPhaseListener)
{
ClassLoader cl = ClassUtils.getClassLoader(null);
- List<PhaseListener> plList = phaseListeners.get(cl);
+ List<Class<? extends PhaseListener>> plList = phaseListeners.get(cl);
if (plList == null)
{
- plList = new CopyOnWriteArrayList<PhaseListener>();
+ plList = new CopyOnWriteArrayList<Class<? extends PhaseListener>>();
phaseListeners.put(cl, plList);
}
+
+ // just add the Class of the PhaseListener and do not instantiate it now,
+ // because there is no FacesContext available at this point and the
+ // constructor of the PhaseListener could use it (possible in JSF 2.0)
plList.add(newPhaseListener);
}
- private PhaseListener createPhaseListenerInstance(ProcessAnnotatedType processAnnotatedType)
+ private static PhaseListener createPhaseListenerInstance(
+ Class<? extends PhaseListener> phaseListenerClass)
{
return ClassUtils.tryToInstantiateClass(
- processAnnotatedType.getAnnotatedType().getJavaClass(), PhaseListener.class);
+ phaseListenerClass, PhaseListener.class);
}
- //current workaround some servers
public static List<PhaseListener> consumePhaseListeners()
{
ClassLoader classLoader = ClassUtils.getClassLoader(null);
- List<PhaseListener> foundPhaseListeners = phaseListeners.get(classLoader);
+ List<Class<? extends PhaseListener>> foundPhaseListeners = phaseListeners.get(classLoader);
if(foundPhaseListeners != null && ! foundPhaseListeners.isEmpty())
{
List<PhaseListener> result = new ArrayList<PhaseListener>(foundPhaseListeners.size());
- for(PhaseListener phaseListener : foundPhaseListeners)
+ for(Class<? extends PhaseListener> phaseListenerClass : foundPhaseListeners)
{
+ PhaseListener phaseListener = createPhaseListenerInstance(phaseListenerClass);
result.add(tryToInjectDependencies(phaseListener));
}