}
private void configureRuntimeConfig()
{
RuntimeConfig runtimeConfig = RuntimeConfig.getCurrentInstance(_externalContext);
FacesConfigData dispenser = getDispenser();
List<String> knownNamespaces = new ArrayList<String>();
for (ComponentTagDeclaration declaration : dispenser.getComponentTagDeclarations())
{
runtimeConfig.addComponentTagDeclaration(declaration);
if (declaration.getNamespace() != null)
{
knownNamespaces.add(declaration.getNamespace());
}
}
for (ManagedBean bean : dispenser.getManagedBeans())
{
if (log.isLoggable(Level.WARNING) && runtimeConfig.getManagedBean(bean.getManagedBeanName()) != null)
{
log.warning("More than one managed bean w/ the name of '" + bean.getManagedBeanName()
+ "' - only keeping the last ");
}
runtimeConfig.addManagedBean(bean.getManagedBeanName(), bean);
}
removePurgedBeansFromSessionAndApplication(runtimeConfig);
for (NavigationRule rule : dispenser.getNavigationRules())
{
runtimeConfig.addNavigationRule(rule);
}
for (String converterClassName : dispenser.getConverterConfigurationByClassName())
{
runtimeConfig.addConverterConfiguration(converterClassName,
_dispenser.getConverterConfiguration(converterClassName));
}
for (ResourceBundle bundle : dispenser.getResourceBundles())
{
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
{
Object creationMetaData = getInjectionProvider().inject(elResolver);
injectedBeansAndMetaData.add(new BeanEntry(elResolver, creationMetaData));
getInjectionProvider().postConstruct(elResolver, creationMetaData);
}
catch (InjectionProviderException e)
{
log.log(Level.SEVERE, "Error while injecting ELResolver", e);
}
runtimeConfig.addFacesConfigElResolver(elResolver);
}
runtimeConfig.setFacesVersion(dispenser.getFacesVersion());
runtimeConfig.setNamedEventManager(new NamedEventManager());
for (NamedEvent event : dispenser.getNamedEvents())
{
try
{
Class<? extends ComponentSystemEvent> clazz = ClassUtils.classForName(event.getEventClass());
runtimeConfig.getNamedEventManager().addNamedEvent(event.getShortName(), clazz);
}
catch (ClassNotFoundException e)
{
log.log(Level.SEVERE, "Named event could not be initialized, reason:", e);
}
}
String comparatorClass = _externalContext.getInitParameter(ResolverBuilderBase.EL_RESOLVER_COMPARATOR);
if (comparatorClass != null && !"".equals(comparatorClass))
{
// get the comparator class
Class<Comparator<ELResolver>> clazz;
try
{
clazz = (Class<Comparator<ELResolver>>) ClassUtils.classForName(comparatorClass);
// create the instance
Comparator<ELResolver> comparator = ClassUtils.newInstance(clazz);
runtimeConfig.setELResolverComparator(comparator);
}
catch (Exception e)
{
if (log.isLoggable(Level.SEVERE))
{
log.log(Level.SEVERE, "Cannot instantiate EL Resolver Comparator " + comparatorClass
+ " . Check org.apache.myfaces.EL_RESOLVER_COMPARATOR web config param. "
+ "Initialization continues with no comparator used.", e);
}
}
}
else
{
runtimeConfig.setELResolverComparator(null);
}
String elResolverPredicateClass = _externalContext.getInitParameter(ResolverBuilderBase.EL_RESOLVER_PREDICATE);
if (elResolverPredicateClass != null && !"".equals(elResolverPredicateClass))
{
// get the comparator class
Class<Predicate> clazz;
try
{
clazz = (Class<Predicate>) ClassUtils.classForName(elResolverPredicateClass);
// create the instance
Predicate elResolverPredicate = ClassUtils.newInstance(clazz);
runtimeConfig.setELResolverPredicate(elResolverPredicate);
}
catch (Exception e)
{
if (log.isLoggable(Level.SEVERE))
{
log.log(Level.SEVERE, "Cannot instantiate EL Resolver Comparator " + comparatorClass
+ " . Check org.apache.myfaces.EL_RESOLVER_COMPARATOR web config param. "
+ "Initialization continues with no comparator used.", e);
}
}
}
else
{
runtimeConfig.setELResolverPredicate(null);
}
for (FaceletsProcessing faceletsProcessing : dispenser.getFaceletsProcessing())
{
runtimeConfig.addFaceletProcessingConfiguration(faceletsProcessing.getFileExtension(), faceletsProcessing);
}
ResourceLibraryContractsProvider rlcp = ResourceLibraryContractsProviderFactory.
getFacesConfigResourceProviderFactory(_externalContext).
createResourceLibraryContractsProvider(_externalContext);
try
{
// JSF 2.2 section 11.4.2.1 scan for available resource library contracts
// and store the result in a internal data structure, so it can be used
// later in ViewDeclarationLanguage.calculateResourceLibraryContracts(
// FacesContext context, String viewId)
runtimeConfig.setExternalContextResourceLibraryContracts(
rlcp.getExternalContextResourceLibraryContracts(_externalContext));
runtimeConfig.setClassLoaderResourceLibraryContracts(
rlcp.getClassloaderResourceLibraryContracts(_externalContext));
}
catch(Exception e)
{
if (log.isLoggable(Level.SEVERE))
{
log.log(Level.SEVERE,
"An error was found when scanning for resource library contracts", e);
}
}
// JSF 2.2 section 11.4.2.1 check all contracts are loaded
if (log.isLoggable(Level.INFO))
{
for (List<String> list : runtimeConfig.getContractMappings().values())
{
for (String contract : list)
{
if (!runtimeConfig.getResourceLibraryContracts().contains(contract))
{
log.log(Level.INFO,
"Resource Library Contract "+ contract + " was not found while scanning for "
+ "available contracts.");
}
}
}
}
// JSF 2.2 section 11.4.2.1 if no contractMappings set, all available contracts applies
// to all views.
if (runtimeConfig.getContractMappings().isEmpty())
{
String[] contracts = runtimeConfig.getResourceLibraryContracts().toArray(
new String[runtimeConfig.getResourceLibraryContracts().size()]);
runtimeConfig.addContractMapping("*", contracts);
}
for (String resourceResolver : dispenser.getResourceResolvers())
{
runtimeConfig.addResourceResolver(resourceResolver);
}
for (FaceletTagLibrary faceletTagLibrary : dispenser.getTagLibraries())
{
runtimeConfig.addFaceletTagLibrary(faceletTagLibrary);
if (faceletTagLibrary.getNamespace() != null)
{
knownNamespaces.add(faceletTagLibrary.getNamespace());
}
}
// Add default namespaces to the known namespaces
knownNamespaces.add("http://xmlns.jcp.org/jsf/core");
knownNamespaces.add("http://java.sun.com/jsf/core");
knownNamespaces.add("http://xmlns.jcp.org/jsf/html");
knownNamespaces.add("http://java.sun.com/jsf/html");
knownNamespaces.add("http://xmlns.jcp.org/jsf/facelets");
knownNamespaces.add("http://java.sun.com/jsf/facelets");
knownNamespaces.add("http://xmlns.jcp.org/jsp/jstl/core");
knownNamespaces.add("http://java.sun.com/jsp/jstl/core");
knownNamespaces.add("http://java.sun.com/jstl/core");
knownNamespaces.add("http://xmlns.jcp.org/jsp/jstl/functions");
knownNamespaces.add("http://java.sun.com/jsp/jstl/functions");
knownNamespaces.add("http://xmlns.jcp.org/jsf/composite");
knownNamespaces.add("http://java.sun.com/jsf/composite");
knownNamespaces.add("http://xmlns.jcp.org/jsf");
knownNamespaces.add("http://java.sun.com/jsf");
knownNamespaces.add("http://xmlns.jcp.org/jsf/passthrough");
knownNamespaces.add("http://java.sun.com/jsf/passthrough");
Map<Integer, String> namespaceById = new HashMap<Integer, String>();
Map<String, Integer> idByNamespace = new HashMap<String, Integer>();
// Sort them to ensure the same id
Collections.sort(knownNamespaces);
for (int i = 0; i < knownNamespaces.size(); i++)
{
namespaceById.put(i, knownNamespaces.get(i));
idByNamespace.put(knownNamespaces.get(i), i);
}
runtimeConfig.setNamespaceById(Collections.unmodifiableMap(namespaceById));
runtimeConfig.setIdByNamespace(Collections.unmodifiableMap(idByNamespace));
for (ViewPoolMapping viewPoolMapping : dispenser.getViewPoolMappings())
{
runtimeConfig.addViewPoolMapping(viewPoolMapping);
}
}