You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2013/10/16 00:33:52 UTC
svn commit: r1532573 - in /myfaces/core/trunk: api/src/main/java/javax/faces/
impl/src/main/java/org/apache/myfaces/cdi/dependent/
impl/src/main/java/org/apache/myfaces/cdi/impl/
impl/src/main/java/org/apache/myfaces/config/ impl/src/main/java/org/apac...
Author: gpetracek
Date: Tue Oct 15 22:33:51 2013
New Revision: 1532573
URL: http://svn.apache.org/r1532573
Log:
MYFACES-3786 (agreed) approach which doesn't require unique-ids
Added:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/dependent/BeanEntry.java
Modified:
myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java
myfaces/core/trunk/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/impl/CDIAnnotationInjectionProvider.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/InjectionProvider.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoAnnotationInjectionProvider.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoInjectionAnnotationInjectionProvider.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/Tomcat7AnnotationInjectionProvider.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/TomcatAnnotationInjectionProvider.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
Modified: myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/FactoryFinder.java Tue Oct 15 22:33:51 2013
@@ -18,17 +18,6 @@
*/
package javax.faces;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.security.AccessController;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
import javax.faces.application.ApplicationFactory;
import javax.faces.component.visit.VisitContextFactory;
import javax.faces.context.ExceptionHandlerFactory;
@@ -44,6 +33,20 @@ import javax.faces.render.RenderKitFacto
import javax.faces.view.ViewDeclarationLanguageFactory;
import javax.faces.view.facelets.FaceletCacheFactory;
import javax.faces.view.facelets.TagHandlerDelegateFactory;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
@@ -91,6 +94,10 @@ public final class FactoryFinder
private static final ClassLoader MYFACES_CLASSLOADER;
private static final String INJECTION_PROVIDER_INSTANCE = "oam.spi.INJECTION_PROVIDER_KEY";
+ private static final String INJECTED_BEAN_STORAGE_KEY = "org.apache.myfaces.spi.BEAN_ENTRY_STORAGE";
+ private static final String BEAN_ENTRY_CLASS_NAME = "org.apache.myfaces.cdi.dependent.BeanEntry";
+
+ private static final Logger LOGGER = Logger.getLogger(FactoryFinder.class.getName());
static
{
@@ -315,6 +322,19 @@ public final class FactoryFinder
}
}
+ List beanEntryStorage;
+
+ synchronized (factoryClassNames)
+ {
+ beanEntryStorage = (List)factoryMap.get(INJECTED_BEAN_STORAGE_KEY);
+
+ if (beanEntryStorage == null)
+ {
+ beanEntryStorage = new CopyOnWriteArrayList();
+ factoryMap.put(INJECTED_BEAN_STORAGE_KEY, beanEntryStorage);
+ }
+ }
+
List<String> classNames;
Object factory;
Object injectionProvider;
@@ -330,7 +350,7 @@ public final class FactoryFinder
injectionProvider = factoryMap.get(INJECTION_PROVIDER_INSTANCE);
}
-
+
if (injectionProvider == null)
{
injectionProvider = getInjectionProvider();
@@ -342,7 +362,7 @@ public final class FactoryFinder
// release lock while calling out
factory = newFactoryInstance(ABSTRACT_FACTORY_CLASSES.get(factoryName),
- classNames.iterator(), classLoader, injectionProvider);
+ classNames.iterator(), classLoader, injectionProvider, beanEntryStorage);
synchronized (factoryClassNames)
{
@@ -384,16 +404,19 @@ public final class FactoryFinder
return null;
}
- private static void injectAndPostConstruct(Object injectionProvider, Object instance)
+ private static void injectAndPostConstruct(Object injectionProvider, Object instance, List injectedBeanStorage)
{
if (injectionProvider != null)
{
try
{
- _FactoryFinderProviderFactory.INJECTION_PROVIDER_INJECT_METHOD.invoke(
+ Object creationMetaData = _FactoryFinderProviderFactory.INJECTION_PROVIDER_INJECT_METHOD.invoke(
injectionProvider, instance);
+
+ addBeanEntry(instance, creationMetaData, injectedBeanStorage);
+
_FactoryFinderProviderFactory.INJECTION_PROVIDER_POST_CONSTRUCT_METHOD.invoke(
- injectionProvider, instance);
+ injectionProvider, instance, creationMetaData);
}
catch (Exception ex)
{
@@ -402,14 +425,14 @@ public final class FactoryFinder
}
}
- private static void preDestroy(Object injectionProvider, Object instance)
+ private static void preDestroy(Object injectionProvider, Object beanEntry)
{
if (injectionProvider != null)
{
try
{
_FactoryFinderProviderFactory.INJECTION_PROVIDER_PRE_DESTROY_METHOD.invoke(
- injectionProvider, instance);
+ injectionProvider, getInstance(beanEntry), getCreationMetaData(beanEntry));
}
catch (Exception ex)
{
@@ -418,8 +441,56 @@ public final class FactoryFinder
}
}
+ private static Object getInstance(Object beanEntry)
+ {
+ try
+ {
+ Method getterMethod = getMethod(beanEntry, "getInstance");
+ return getterMethod.invoke(beanEntry);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private static Object getCreationMetaData(Object beanEntry)
+ {
+ try
+ {
+ Method getterMethod = getMethod(beanEntry, "getCreationMetaData");
+ return getterMethod.invoke(beanEntry);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private static Method getMethod(Object beanEntry, String methodName) throws NoSuchMethodException
+ {
+ return beanEntry.getClass().getDeclaredMethod(methodName);
+ }
+
+ private static void addBeanEntry(Object instance, Object creationMetaData, List injectedBeanStorage)
+ {
+ try
+ {
+ Class<?> beanEntryClass = _FactoryFinderProviderFactory.classForName(BEAN_ENTRY_CLASS_NAME);
+ Constructor beanEntryConstructor = beanEntryClass.getDeclaredConstructor(Object.class, Object.class);
+
+ Object result = beanEntryConstructor.newInstance(instance, creationMetaData);
+ injectedBeanStorage.add(result);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
private static Object newFactoryInstance(Class<?> interfaceClass, Iterator<String> classNamesIterator,
- ClassLoader classLoader, Object injectionProvider)
+ ClassLoader classLoader, Object injectionProvider,
+ List injectedBeanStorage)
{
try
{
@@ -448,7 +519,7 @@ public final class FactoryFinder
{
// nothing to decorate
current = implClass.newInstance();
- injectAndPostConstruct(injectionProvider, current);
+ injectAndPostConstruct(injectionProvider, current, injectedBeanStorage);
}
else
{
@@ -461,7 +532,7 @@ public final class FactoryFinder
{
// create new decorator wrapping current
current = delegationConstructor.newInstance(new Object[] { current });
- injectAndPostConstruct(injectionProvider, current);
+ injectAndPostConstruct(injectionProvider, current, injectedBeanStorage);
}
catch (InstantiationException e)
{
@@ -480,7 +551,7 @@ public final class FactoryFinder
{
// no decorator pattern support
current = implClass.newInstance();
- injectAndPostConstruct(injectionProvider, current);
+ injectAndPostConstruct(injectionProvider, current, injectedBeanStorage);
}
}
}
@@ -673,22 +744,31 @@ public final class FactoryFinder
Object injectionProvider = factoryMap.remove(INJECTION_PROVIDER_INSTANCE);
if (injectionProvider != null)
{
- for (Map.Entry<String, Object> entry : factoryMap.entrySet())
+ List injectedBeanStorage = (List)factoryMap.get(INJECTED_BEAN_STORAGE_KEY);
+
+ FacesException firstException = null;
+ for (Object entry : injectedBeanStorage)
{
- Object instance = entry.getValue();
- while (instance != null)
+ try
{
- preDestroy(injectionProvider, instance);
- if (instance instanceof FacesWrapper)
- {
- instance = ((FacesWrapper) instance).getWrapped();
- }
- else
+ preDestroy(injectionProvider, entry);
+ }
+ catch (FacesException e)
+ {
+ LOGGER.log(Level.SEVERE, "#preDestroy failed", e);
+
+ if (firstException == null)
{
- instance = null;
+ firstException = e; //all preDestroy callbacks need to get invoked
}
}
}
+ injectedBeanStorage.clear();
+
+ if (firstException != null)
+ {
+ throw firstException;
+ }
}
}
}
Modified: myfaces/core/trunk/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java Tue Oct 15 22:33:51 2013
@@ -62,7 +62,7 @@ class _FactoryFinderProviderFactory
public static final Method INJECTION_PROVIDER_INJECT_METHOD;
public static final Method INJECTION_PROVIDER_POST_CONSTRUCT_METHOD;
public static final Method INJECTION_PROVIDER_PRE_DESTROY_METHOD;
-
+
static
{
Class factoryFinderFactoryClass = null;
@@ -121,9 +121,9 @@ class _FactoryFinderProviderFactory
injectionProviderInjectMethod = injectionProviderClass.
getMethod("inject", Object.class);
injectionProviderPostConstructMethod = injectionProviderClass.
- getMethod("postConstruct", Object.class);
+ getMethod("postConstruct", Object.class, Object.class);
injectionProviderPreDestroyMethod = injectionProviderClass.
- getMethod("preDestroy", Object.class);
+ getMethod("preDestroy", Object.class, Object.class);
}
}
catch (Exception e)
Added: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/dependent/BeanEntry.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/dependent/BeanEntry.java?rev=1532573&view=auto
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/dependent/BeanEntry.java (added)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/dependent/BeanEntry.java Tue Oct 15 22:33:51 2013
@@ -0,0 +1,41 @@
+/*
+ * 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.dependent;
+
+public class BeanEntry
+{
+ private final Object instance;
+ private final Object creationMetaData;
+
+ public BeanEntry(Object instance, Object creationMetaData)
+ {
+ this.instance = instance;
+ this.creationMetaData = creationMetaData;
+ }
+
+ public Object getInstance()
+ {
+ return instance;
+ }
+
+ public Object getCreationMetaData()
+ {
+ return creationMetaData;
+ }
+}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/impl/CDIAnnotationInjectionProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/impl/CDIAnnotationInjectionProvider.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/impl/CDIAnnotationInjectionProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/cdi/impl/CDIAnnotationInjectionProvider.java Tue Oct 15 22:33:51 2013
@@ -18,7 +18,6 @@
*/
package org.apache.myfaces.cdi.impl;
-import org.apache.myfaces.cdi.dependent.DependentInstanceEntry;
import org.apache.myfaces.cdi.util.CDIUtils;
import org.apache.myfaces.spi.InjectionProvider;
import org.apache.myfaces.spi.InjectionProviderException;
@@ -28,8 +27,6 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.faces.context.ExternalContext;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
/**
*
@@ -39,30 +36,25 @@ public class CDIAnnotationInjectionProvi
{
private BeanManager beanManager;
- private Map<Integer, DependentInstanceEntry> facesApplicationDependentBeans =
- new ConcurrentHashMap<Integer, DependentInstanceEntry>();
-
public CDIAnnotationInjectionProvider(ExternalContext externalContext)
{
beanManager = CDIUtils.getBeanManager(externalContext);
}
@Override
- public void inject(Object instance) throws InjectionProviderException
+ public Object inject(Object instance) throws InjectionProviderException
{
AnnotatedType annoType = beanManager.createAnnotatedType(instance.getClass());
InjectionTarget target = beanManager.createInjectionTarget(annoType);
CreationalContext<?> creationalContext = beanManager.createCreationalContext(null);
- facesApplicationDependentBeans.put(
- System.identityHashCode(instance),
- new DependentInstanceEntry(instance, creationalContext));
-
target.inject(instance, creationalContext);
+
+ return creationalContext;
}
@Override
- public void postConstruct(Object instance) throws InjectionProviderException
+ public void postConstruct(Object instance, Object creationMetaData) throws InjectionProviderException
{
AnnotatedType annoType = beanManager.createAnnotatedType(instance.getClass());
InjectionTarget target = beanManager.createInjectionTarget(annoType);
@@ -70,17 +62,15 @@ public class CDIAnnotationInjectionProvi
}
@Override
- public void preDestroy(Object instance) throws InjectionProviderException
+ public void preDestroy(Object instance, Object creationMetaData) throws InjectionProviderException
{
- AnnotatedType annoType = beanManager.createAnnotatedType(instance.getClass());
- InjectionTarget target = beanManager.createInjectionTarget(annoType);
- target.preDestroy(instance);
-
- DependentInstanceEntry entry = facesApplicationDependentBeans.get(System.identityHashCode(instance));
-
- if (entry != null)
+ if (creationMetaData instanceof CreationalContext)
{
- entry.getCreationalContext().release();
+ AnnotatedType annoType = beanManager.createAnnotatedType(instance.getClass());
+ InjectionTarget target = beanManager.createInjectionTarget(annoType);
+ target.preDestroy(instance);
+
+ ((CreationalContext)creationMetaData).release();
}
}
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/FacesConfigurator.java Tue Oct 15 22:33:51 2013
@@ -34,6 +34,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.StringTokenizer;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -131,6 +132,7 @@ import org.apache.myfaces.shared.util.St
import org.apache.myfaces.shared.util.WebConfigParamUtils;
import org.apache.myfaces.shared_impl.util.serial.DefaultSerialFactory;
import org.apache.myfaces.shared_impl.util.serial.SerialFactory;
+import org.apache.myfaces.cdi.dependent.BeanEntry;
import org.apache.myfaces.spi.FacesConfigurationMerger;
import org.apache.myfaces.spi.FacesConfigurationMergerFactory;
import org.apache.myfaces.spi.InjectionProvider;
@@ -181,7 +183,9 @@ public class FacesConfigurator
private static final String DEFAULT_CLIENT_WINDOW_FACTORY = ClientWindowFactoryImpl.class.getName();
private static final String DEFAULT_FLOW_FACTORY = FlowHandlerFactoryImpl.class.getName();
private static final String DEFAULT_FACES_CONFIG = "/WEB-INF/faces-config.xml";
-
+
+ private static final String INJECTED_BEAN_STORAGE_KEY = "org.apache.myfaces.spi.BEAN_ENTRY_STORAGE";
+
/**
* Set this attribute if the current configuration requires enable window mode
*/
@@ -207,6 +211,7 @@ public class FacesConfigurator
}
_externalContext = externalContext;
+ _externalContext.getApplicationMap().put(INJECTED_BEAN_STORAGE_KEY, new CopyOnWriteArrayList());
}
/**
@@ -785,8 +790,14 @@ public class FacesConfigurator
_callInjectAndPostConstruct(innerInstance);
}
}
- getInjectionProvider().inject(instance);
- getInjectionProvider().postConstruct(instance);
+ List<BeanEntry> injectedBeanStorage =
+ (List<BeanEntry>)_externalContext.getApplicationMap().get(INJECTED_BEAN_STORAGE_KEY);
+
+ Object creationMetaData = getInjectionProvider().inject(instance);
+
+ injectedBeanStorage.add(new BeanEntry(instance, creationMetaData));
+
+ getInjectionProvider().postConstruct(instance, creationMetaData);
}
catch (InjectionProviderException ex)
{
@@ -878,13 +889,19 @@ public class FacesConfigurator
runtimeConfig.addResourceBundle(bundle);
}
+ List<BeanEntry> injectedBeansAndMetaData =
+ (List<BeanEntry>)_externalContext.getApplicationMap().get(INJECTED_BEAN_STORAGE_KEY);
+
for (String className : dispenser.getElResolvers())
{
ELResolver elResolver = (ELResolver) ClassUtils.newInstance(className, ELResolver.class);
try
{
- getInjectionProvider().inject(elResolver);
- getInjectionProvider().postConstruct(elResolver);
+ Object creationMetaData = getInjectionProvider().inject(elResolver);
+
+ injectedBeansAndMetaData.add(new BeanEntry(elResolver, creationMetaData));
+
+ getInjectionProvider().postConstruct(elResolver, creationMetaData);
}
catch (InjectionProviderException e)
{
@@ -1146,7 +1163,10 @@ public class FacesConfigurator
// create the lifecycle used by the app
LifecycleFactory lifecycleFactory
= (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
-
+
+ List<BeanEntry> injectedBeanStorage =
+ (List<BeanEntry>)_externalContext.getApplicationMap().get(INJECTED_BEAN_STORAGE_KEY);
+
//Lifecycle lifecycle = lifecycleFactory.getLifecycle(getLifecycleId());
for (Iterator<String> it = lifecycleFactory.getLifecycleIds(); it.hasNext();)
{
@@ -1159,8 +1179,12 @@ public class FacesConfigurator
{
PhaseListener listener = (PhaseListener)
ClassUtils.newInstance(listenerClassName, PhaseListener.class);
- getInjectionProvider().inject(listener);
- getInjectionProvider().postConstruct(listener);
+
+ Object creationMetaData = getInjectionProvider().inject(listener);
+
+ injectedBeanStorage.add(new BeanEntry(listener, creationMetaData));
+
+ getInjectionProvider().postConstruct(listener, creationMetaData);
lifecycle.addPhaseListener(listener);
}
catch (ClassCastException e)
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/InjectionProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/InjectionProvider.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/InjectionProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/InjectionProvider.java Tue Oct 15 22:33:51 2013
@@ -26,11 +26,11 @@ package org.apache.myfaces.spi;
*/
public abstract class InjectionProvider
{
- public abstract void inject(Object instance) throws InjectionProviderException;
+ public abstract Object inject(Object instance) throws InjectionProviderException;
- public abstract void postConstruct(Object instance) throws InjectionProviderException;
+ public abstract void postConstruct(Object instance, Object creationMetaData) throws InjectionProviderException;
- public abstract void preDestroy(Object instance) throws InjectionProviderException;
+ public abstract void preDestroy(Object instance, Object creationMetaData) throws InjectionProviderException;
public boolean isAvailable()
{
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoAnnotationInjectionProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoAnnotationInjectionProvider.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoAnnotationInjectionProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoAnnotationInjectionProvider.java Tue Oct 15 22:33:51 2013
@@ -25,19 +25,20 @@ public class NoAnnotationInjectionProvid
{
@Override
- public void postConstruct(Object o) throws InjectionProviderException
+ public void postConstruct(Object instance, Object creationMetaData) throws InjectionProviderException
{
// No op
}
@Override
- public void inject(Object instance) throws InjectionProviderException
+ public Object inject(Object instance) throws InjectionProviderException
{
// No op
+ return null;
}
@Override
- public void preDestroy(Object instance) throws InjectionProviderException
+ public void preDestroy(Object instance, Object creationMetaData) throws InjectionProviderException
{
// No op
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoInjectionAnnotationInjectionProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoInjectionAnnotationInjectionProvider.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoInjectionAnnotationInjectionProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/NoInjectionAnnotationInjectionProvider.java Tue Oct 15 22:33:51 2013
@@ -85,11 +85,11 @@ public class NoInjectionAnnotationInject
}
@Override
- public void inject(Object object) throws InjectionProviderException
+ public Object inject(Object instance) throws InjectionProviderException
{
try
{
- processAnnotations(object);
+ processAnnotations(instance);
}
catch (IllegalAccessException ex)
{
@@ -103,6 +103,7 @@ public class NoInjectionAnnotationInject
{
throw new InjectionProviderException(ex);
}
+ return null;
}
@@ -125,7 +126,7 @@ public class NoInjectionAnnotationInject
* Call postConstruct method on the specified instance.
*/
@Override
- public void postConstruct(Object instance) throws InjectionProviderException
+ public void postConstruct(Object instance, Object creationMetaData) throws InjectionProviderException
{
// TODO the servlet spec is not clear about searching in superclass??
Class clazz = instance.getClass();
@@ -177,7 +178,7 @@ public class NoInjectionAnnotationInject
}
@Override
- public void preDestroy(Object instance) throws InjectionProviderException
+ public void preDestroy(Object instance, Object creationMetaData) throws InjectionProviderException
{
// TODO the servlet spec is not clear about searching in superclass??
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/Tomcat7AnnotationInjectionProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/Tomcat7AnnotationInjectionProvider.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/Tomcat7AnnotationInjectionProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/Tomcat7AnnotationInjectionProvider.java Tue Oct 15 22:33:51 2013
@@ -46,12 +46,13 @@ public class Tomcat7AnnotationInjectionP
}
@Override
- public void inject(Object object) throws InjectionProviderException
+ public Object inject(Object instance) throws InjectionProviderException
{
+ return null;
}
@Override
- public void preDestroy(Object instance) throws InjectionProviderException
+ public void preDestroy(Object instance, Object creationMetaData) throws InjectionProviderException
{
InstanceManager manager = instanceManagers
.get(ClassUtils.getContextClassLoader());
@@ -74,7 +75,7 @@ public class Tomcat7AnnotationInjectionP
}
@Override
- public void postConstruct(Object instance) throws InjectionProviderException
+ public void postConstruct(Object instance, Object creationMetaData) throws InjectionProviderException
{
InstanceManager manager = instanceManagers
.get(ClassUtils.getContextClassLoader());
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/TomcatAnnotationInjectionProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/TomcatAnnotationInjectionProvider.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/TomcatAnnotationInjectionProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/TomcatAnnotationInjectionProvider.java Tue Oct 15 22:33:51 2013
@@ -42,11 +42,11 @@ public class TomcatAnnotationInjectionPr
}
@Override
- public void inject(Object object) throws InjectionProviderException
+ public Object inject(Object instance) throws InjectionProviderException
{
try
{
- annotationProcessor.processAnnotations(object);
+ annotationProcessor.processAnnotations(instance);
}
catch (IllegalAccessException ex)
{
@@ -60,18 +60,19 @@ public class TomcatAnnotationInjectionPr
{
throw new InjectionProviderException(ex);
}
+ return null;
}
@Override
- public void preDestroy(Object o) throws InjectionProviderException
+ public void preDestroy(Object instance, Object creationMetaData) throws InjectionProviderException
{
if (log.isLoggable(Level.FINEST))
{
- log.info("Destroy instance of " + o.getClass().getName());
+ log.info("Destroy instance of " + instance.getClass().getName());
}
try
{
- annotationProcessor.preDestroy(o);
+ annotationProcessor.preDestroy(instance);
}
catch (IllegalAccessException ex)
{
@@ -100,11 +101,11 @@ public class TomcatAnnotationInjectionPr
}
@Override
- public void postConstruct(Object o) throws InjectionProviderException
+ public void postConstruct(Object instance, Object creationMetaData) throws InjectionProviderException
{
try
{
- annotationProcessor.postConstruct(o);
+ annotationProcessor.postConstruct(instance);
}
catch (IllegalAccessException ex)
{
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java?rev=1532573&r1=1532572&r2=1532573&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java Tue Oct 15 22:33:51 2013
@@ -18,8 +18,6 @@
*/
package org.apache.myfaces.webapp;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
import org.apache.myfaces.config.FacesConfigValidator;
import org.apache.myfaces.config.FacesConfigurator;
@@ -32,8 +30,15 @@ import org.apache.myfaces.context.servle
import org.apache.myfaces.shared.context.ExceptionHandlerImpl;
import org.apache.myfaces.shared.util.StateUtils;
import org.apache.myfaces.shared.util.WebConfigParamUtils;
+import org.apache.myfaces.cdi.dependent.BeanEntry;
+import org.apache.myfaces.spi.InjectionProvider;
+import org.apache.myfaces.spi.InjectionProviderException;
+import org.apache.myfaces.spi.InjectionProviderFactory;
+import org.apache.myfaces.spi.ViewScopeProvider;
+import org.apache.myfaces.spi.ViewScopeProviderFactory;
import org.apache.myfaces.spi.WebConfigProvider;
import org.apache.myfaces.spi.WebConfigProviderFactory;
+import org.apache.myfaces.util.ExternalSpecifications;
import org.apache.myfaces.view.facelets.tag.MetaRulesetImpl;
import javax.el.ExpressionFactory;
@@ -46,28 +51,17 @@ import javax.faces.context.FacesContext;
import javax.faces.event.PostConstructApplicationEvent;
import javax.faces.event.PreDestroyApplicationEvent;
import javax.faces.event.SystemEvent;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
import javax.servlet.ServletContext;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.el.ELResolver;
-import javax.faces.FacesWrapper;
-import javax.faces.FactoryFinder;
-import javax.faces.event.PhaseListener;
-import javax.faces.lifecycle.Lifecycle;
-import javax.faces.lifecycle.LifecycleFactory;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import org.apache.myfaces.spi.InjectionProvider;
-import org.apache.myfaces.spi.InjectionProviderException;
-import org.apache.myfaces.spi.InjectionProviderFactory;
-import org.apache.myfaces.util.ExternalSpecifications;
-import org.apache.myfaces.spi.ViewScopeProvider;
-import org.apache.myfaces.spi.ViewScopeProviderFactory;
/**
* Performs common initialization tasks.
@@ -114,6 +108,8 @@ public abstract class AbstractFacesIniti
private static final String CDI_SERVLET_CONTEXT_BEAN_MANAGER_ATTRIBUTE =
"javax.enterprise.inject.spi.BeanManager";
+ private static final String INJECTED_BEAN_STORAGE_KEY = "org.apache.myfaces.spi.BEAN_ENTRY_STORAGE";
+
/**
* Performs all necessary initialization tasks like configuring this JSF
* application.
@@ -591,74 +587,23 @@ public abstract class AbstractFacesIniti
{
InjectionProvider injectionProvider = InjectionProviderFactory.getInjectionProviderFactory(
facesContext.getExternalContext()).getInjectionProvider(facesContext.getExternalContext());
-
- // javax.el.ELResolver
- RuntimeConfig runtimeConfig = RuntimeConfig.getCurrentInstance(facesContext.getExternalContext());
-
- if (runtimeConfig.getFacesConfigElResolvers() != null)
- {
- for (ELResolver elResolver : runtimeConfig.getFacesConfigElResolvers())
- {
- _callPreDestroy(injectionProvider, elResolver);
- }
- }
-
- //javax.faces.application.NavigationHandler
- _callPreDestroy(injectionProvider, facesContext.getApplication().getNavigationHandler());
-
- //javax.faces.application.ResourceHandler
- _callPreDestroy(injectionProvider, facesContext.getApplication().getResourceHandler());
-
- //javax.faces.application.StateManager
- _callPreDestroy(injectionProvider, facesContext.getApplication().getStateManager());
-
- //javax.faces.event.ActionListener
- _callPreDestroy(injectionProvider, facesContext.getApplication().getActionListener());
-
- // javax.faces.lifecycle.PhaseListener
- LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
- for (Iterator<String> iter = factory.getLifecycleIds(); iter.hasNext();)
- {
- Lifecycle lifecycle = factory.getLifecycle(iter.next());
- if (lifecycle != null)
- {
- for (PhaseListener listener : lifecycle.getPhaseListeners())
- {
- _callPreDestroy(injectionProvider, listener);
- }
- }
- }
-
- //javax.faces.event.SystemEventListener
- if (runtimeConfig.getInjectedObjects() != null)
- {
- for (Object object : runtimeConfig.getInjectedObjects())
- {
- _callPreDestroy(injectionProvider, object);
- }
- }
- }
-
- public void _callPreDestroy(InjectionProvider injectionProvider, Object instance)
- {
- while (instance != null)
+ List<BeanEntry> injectedBeanStorage =
+ (List<BeanEntry>)facesContext.getExternalContext().getApplicationMap().get(INJECTED_BEAN_STORAGE_KEY);
+
+ if (injectedBeanStorage != null)
{
- try
+ for (BeanEntry entry : injectedBeanStorage)
{
- injectionProvider.preDestroy(instance);
- if (instance instanceof FacesWrapper)
+ try
{
- instance = ((FacesWrapper)instance).getWrapped();
+ injectionProvider.preDestroy(entry.getInstance(), entry.getCreationMetaData());
}
- else
+ catch (InjectionProviderException ex)
{
- instance = null;
+ log.log(Level.INFO, "Exception on PreDestroy", ex);
}
}
- catch (InjectionProviderException ex)
- {
- log.log(Level.INFO, "Exception on PreDestroy", ex);
- }
+ injectedBeanStorage.clear();
}
}
}