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