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