@Override
public FacesConfigData getFacesConfigData(ExternalContext externalContext)
{
// get the FacesConfigProvider SPI impl in order to get the faces-config data for the merging process
FacesConfigurationProvider facesConfigProvider = FacesConfigurationProviderFactory
.getFacesConfigurationProviderFactory(externalContext).getFacesConfigurationProvider(externalContext);
FacesConfigDispenser dispenser = new DigesterFacesConfigDispenserImpl();
// standard-faces-config.xml
dispenser.feed(facesConfigProvider.getStandardFacesConfig(externalContext));
// META-INF/services/[factory name] factory definitions
dispenser.feed(facesConfigProvider.getMetaInfServicesFacesConfig(externalContext));
// WEB-INF/faces-config.xml
FacesConfig webAppFacesConfig = facesConfigProvider.getWebAppFacesConfig(externalContext);
//read metadata-complete attribute on WEB-INF/faces-config.xml
boolean metadataComplete = false;
if(webAppFacesConfig != null)
{
metadataComplete = Boolean.valueOf(webAppFacesConfig.getMetadataComplete());
}
else
{
//assume false if no faces-config.xml was found
//metadata-complete can only be specified in faces-config.xml per the JSF 2.0 schema
metadataComplete = false;
}
// faces-config data from Annotations
FacesConfig annotationFacesConfig = facesConfigProvider
.getAnnotationsFacesConfig(externalContext, metadataComplete);
if (annotationFacesConfig != null)
{
dispenser.feed(annotationFacesConfig);
}
List<FacesConfig> appConfigResources = new ArrayList<FacesConfig>();
// META-INF/faces-config.xml files
appConfigResources.addAll(facesConfigProvider.getClassloaderFacesConfig(externalContext));
// faces-config.xml files from javax.faces.CONFIG_FILES
appConfigResources.addAll(facesConfigProvider.getContextSpecifiedFacesConfig(externalContext));
// JSF 2.2 ApplicationConfigurationResourceDocumentPopulator FacesConfig
appConfigResources.addAll(facesConfigProvider.
getApplicationConfigurationResourceDocumentPopulatorFacesConfig(externalContext));
// JSF 2.2 Faces Flow
appConfigResources.addAll(facesConfigProvider.getFacesFlowFacesConfig(externalContext));
// apply the ordering and sorting algorithm
orderAndFeedArtifacts(dispenser, appConfigResources, webAppFacesConfig);
List<FacesConfig> faceletTagLibFacesConfig =
facesConfigProvider.getFaceletTaglibFacesConfig(externalContext);
// at last feed facelet taglib faces config. These ones does not need
// to be included in the ordering algorithm.
if (faceletTagLibFacesConfig != null && !faceletTagLibFacesConfig.isEmpty())
{