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/11/01 16:40:18 UTC

svn commit: r1537962 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: config/DefaultFacesConfigurationProvider.java spi/ServiceProviderFinder.java spi/impl/DefaultServiceProviderFinder.java webapp/AbstractFacesInitializer.java

Author: lu4242
Date: Fri Nov  1 15:40:17 2013
New Revision: 1537962

URL: http://svn.apache.org/r1537962
Log:
MYFACES-3814 Allow ServiceProviderFinder to be initialized at startup

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationProvider.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/ServiceProviderFinder.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/DefaultServiceProviderFinder.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationProvider.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationProvider.java?rev=1537962&r1=1537961&r2=1537962&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationProvider.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/config/DefaultFacesConfigurationProvider.java Fri Nov  1 15:40:17 2013
@@ -94,9 +94,13 @@ public class DefaultFacesConfigurationPr
     private static final Set<String> FACTORY_NAMES = new HashSet<String>();
     {
         FACTORY_NAMES.add(FactoryFinder.APPLICATION_FACTORY);
+        FACTORY_NAMES.add(FactoryFinder.CLIENT_WINDOW_FACTORY);
         FACTORY_NAMES.add(FactoryFinder.EXCEPTION_HANDLER_FACTORY);
         FACTORY_NAMES.add(FactoryFinder.EXTERNAL_CONTEXT_FACTORY);
+        FACTORY_NAMES.add(FactoryFinder.FACELET_CACHE_FACTORY);
         FACTORY_NAMES.add(FactoryFinder.FACES_CONTEXT_FACTORY);
+        FACTORY_NAMES.add(FactoryFinder.FLASH_FACTORY);
+        FACTORY_NAMES.add(FactoryFinder.FLOW_HANDLER_FACTORY);
         FACTORY_NAMES.add(FactoryFinder.LIFECYCLE_FACTORY);
         FACTORY_NAMES.add(FactoryFinder.RENDER_KIT_FACTORY);
         FACTORY_NAMES.add(FactoryFinder.TAG_HANDLER_DELEGATE_FACTORY);
@@ -273,6 +277,10 @@ public class DefaultFacesConfigurationPr
                     {
                         factory.addClientWindowFactory(className);
                     }
+                    else if(factoryName.equals(FactoryFinder.FACELET_CACHE_FACTORY)) 
+                    {
+                        factory.addFaceletCacheFactory(className);
+                    }
                     else
                     {
                         throw new IllegalStateException("Unexpected factory name " + factoryName);

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/ServiceProviderFinder.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/ServiceProviderFinder.java?rev=1537962&r1=1537961&r2=1537962&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/ServiceProviderFinder.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/ServiceProviderFinder.java Fri Nov  1 15:40:17 2013
@@ -19,7 +19,12 @@
 package org.apache.myfaces.spi;
 
 import java.util.List;
+import java.util.Map;
 import java.util.ServiceLoader;
+import javax.faces.FactoryFinder;
+import javax.faces.context.ExternalContext;
+import org.apache.myfaces.config.annotation.LifecycleProvider;
+import org.apache.myfaces.config.annotation.LifecycleProviderFactory;
 
 /**
  * This class provides an interface to override SPI handling done by
@@ -34,6 +39,47 @@ import java.util.ServiceLoader;
  */
 public abstract class ServiceProviderFinder
 {
+    public static final String[] KNOWN_SERVICES = 
+    {
+        FactoryFinder.APPLICATION_FACTORY,
+        FactoryFinder.CLIENT_WINDOW_FACTORY,
+        FactoryFinder.EXCEPTION_HANDLER_FACTORY,
+        FactoryFinder.EXTERNAL_CONTEXT_FACTORY,
+        FactoryFinder.FACELET_CACHE_FACTORY,
+        FactoryFinder.FACES_CONTEXT_FACTORY,
+        FactoryFinder.FLASH_FACTORY,
+        FactoryFinder.FLOW_HANDLER_FACTORY,
+        FactoryFinder.LIFECYCLE_FACTORY,
+        FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY,
+        FactoryFinder.RENDER_KIT_FACTORY,
+        FactoryFinder.TAG_HANDLER_DELEGATE_FACTORY,
+        FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY,
+        FactoryFinder.VISIT_CONTEXT_FACTORY,
+        AnnotationProvider.class.getName(),
+        AnnotationProviderFactory.class.getName(),
+        FaceletConfigResourceProvider.class.getName(),
+        FaceletConfigResourceProviderFactory.class.getName(),
+        FacesConfigResourceProvider.class.getName(),
+        FacesConfigResourceProviderFactory.class.getName(),
+        FacesConfigurationMerger.class.getName(),
+        FacesConfigurationMergerFactory.class.getName(),
+        FacesConfigurationProvider.class.getName(),
+        FacesConfigurationProviderFactory.class.getName(),
+        FacesFlowProvider.class.getName(),
+        FacesFlowProviderFactory.class.getName(),
+        FactoryFinderProvider.class.getName(),
+        FactoryFinderProviderFactory.class.getName(),
+        InjectionProvider.class.getName(),
+        InjectionProviderFactory.class.getName(),
+        ResourceLibraryContractsProvider.class.getName(),
+        ResourceLibraryContractsProviderFactory.class.getName(),
+        ViewScopeProvider.class.getName(),
+        ViewScopeProviderFactory.class.getName(),
+        WebConfigProvider.class.getName(),
+        WebConfigProviderFactory.class.getName(),
+        LifecycleProvider.class.getName(),
+        LifecycleProviderFactory.class.getName(),
+    };
     
     /**
      * Gets the list of classes bound to the spiClass key, looking
@@ -46,4 +92,29 @@ public abstract class ServiceProviderFin
     
     public abstract <S> ServiceLoader<S> load(Class<S> spiClass);
     
+    /**
+     * If ServiceProviderFinderFactory knows beforehand or has stored somewhere the
+     * known locations of the SPI interfaces, this method helps to set this config
+     * information so the implementation of this interface can use it. The idea is
+     * MyFaces initialization algorithm will call getKnownServiceProviderMapInfo
+     * method and if the value is not null it will call this method to pass the
+     * map back to the ServiceProviderFinder, so it can take it.
+     * 
+     * @param map 
+     */
+    public void initKnownServiceProviderMapInfo(ExternalContext ectx, Map<String, List<String>> map)
+    {
+    }
+
+    public Map<String, List<String>> calculateKnownServiceProviderMapInfo(ExternalContext ectx, 
+        String[] knownServices)
+    {
+        //Map<String, List<String>> map = new HashMap<String, List<String>>();
+        //for (String service : knownServices)
+        //{
+        //    map.put(service, this.getServiceProviderList(service));
+        //}
+        //return map;
+        return null;
+    }
 }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/DefaultServiceProviderFinder.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/DefaultServiceProviderFinder.java?rev=1537962&r1=1537961&r2=1537962&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/DefaultServiceProviderFinder.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/spi/impl/DefaultServiceProviderFinder.java Fri Nov  1 15:40:17 2013
@@ -29,8 +29,10 @@ import java.util.Enumeration;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.ServiceLoader;
 import java.util.Set;
+import javax.faces.context.ExternalContext;
 
 import org.apache.myfaces.shared.util.ClassUtils;
 import org.apache.myfaces.spi.ServiceProviderFinder;
@@ -44,6 +46,8 @@ import org.apache.myfaces.spi.ServicePro
 public class DefaultServiceProviderFinder extends ServiceProviderFinder
 {
     private static final String META_INF_SERVICES = "META-INF/services/";
+    
+    private Map<String, List<String>> knownServicesMap = null;
 
     protected Set<URL> getURLs(String spiClass)
     {
@@ -71,8 +75,18 @@ public class DefaultServiceProviderFinde
         return Collections.emptySet();
     }
 
+    @Override
     public List<String> getServiceProviderList(String spiClass)
     {
+        if (knownServicesMap != null)
+        {
+            List<String> result = knownServicesMap.get(spiClass);
+            if (result != null)
+            {
+                return result;
+            }
+        }
+        
         Set<URL> urls = getURLs(spiClass);
 
         if (!urls.isEmpty())
@@ -156,8 +170,15 @@ public class DefaultServiceProviderFinde
         return connection.getInputStream();
     }
     
+    @Override
     public <S> ServiceLoader<S> load(Class<S> spiClass)
     {
         return ServiceLoader.load(spiClass);
     }
+
+    @Override
+    public void initKnownServiceProviderMapInfo(ExternalContext ectx, Map<String, List<String>> map)
+    {
+        knownServicesMap = map;
+    }
 }

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=1537962&r1=1537961&r2=1537962&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 Fri Nov  1 15:40:17 2013
@@ -62,6 +62,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.apache.myfaces.spi.ServiceProviderFinder;
+import org.apache.myfaces.spi.ServiceProviderFinderFactory;
 
 /**
  * Performs common initialization tasks.
@@ -132,6 +134,16 @@ public abstract class AbstractFacesIniti
             FacesContext facesContext = FacesContext.getCurrentInstance();
             ExternalContext externalContext = facesContext.getExternalContext();
 
+            // Setup ServiceProviderFinder
+            ServiceProviderFinder spf = ServiceProviderFinderFactory.getServiceProviderFinder(
+                externalContext);
+            Map<String, List<String>> spfConfig = spf.calculateKnownServiceProviderMapInfo(
+                externalContext, ServiceProviderFinder.KNOWN_SERVICES);
+            if (spfConfig != null)
+            {
+                spf.initKnownServiceProviderMapInfo(externalContext, spfConfig);
+            }
+            
             // Parse and validate the web.xml configuration file
             
             if (!WebConfigParamUtils.getBooleanInitParameter(externalContext, INITIALIZE_ALWAYS_STANDALONE, false))