Class FactoryFinder
FactoryFinder implements the standard discovery algorithm for all factory objects specified in the Jakarta Server Faces APIs. For a given factory class name, a corresponding implementation class is searched for based on the following algorithm. Items are listed in order of decreasing search precedence:
-
If the Jakarta Server Faces configuration file bundled into the
WEB-INFdirectory of the webapp contains afactoryentry of the given factory class name, that factory is used. -
If the Jakarta Server Faces configuration files named by the
jakarta.faces.CONFIG_FILESServletContextinit parameter contain anyfactoryentries of the given factory class name, those injectionProvider are used, with the last one taking precedence. -
If there are any Jakarta Server Faces configuration files bundled into the
META-INFdirectory of any jars on theServletContext's resource paths, thefactoryentries of the given factory class name in those files are used, with the last one taking precedence. -
If a
META-INF/services/{factory-class-name}resource is visible to the web application class loader for the calling application (typically as a injectionProvider of being present in the manifest of a JAR file), its first line is read and assumed to be the name of the factory implementation class to use. -
If none of the above steps yield a match, the Jakarta Server Faces implementation specific class is used.
If any of the injectionProvider found on any of the steps above happen to have a one-argument constructor, with
argument the type being the abstract factory class, that constructor is invoked, and the previous match is passed to
the constructor. For example, say the container vendor provided an implementation of
FacesContextFactory, and identified it in
META-INF/services/jakarta.faces.context.FacesContextFactory in a jar on the webapp ClassLoader. Also say
this implementation provided by the container vendor had a one argument constructor that took a
FacesContextFactory instance. The FactoryFinder system would call that one-argument
constructor, passing the implementation of FacesContextFactory provided by the Jakarta Server Faces
implementation.
If a Factory implementation does not provide a proper one-argument constructor, it must provide a zero-arguments constructor in order to be successfully instantiated.
Once the name of the factory implementation class is located, the web application class loader for the calling application is requested to load this class, and a corresponding instance of the class will be created. A side effect of this rule is that each web application will receive its own instance of each factory class, whether the Jakarta Server Faces implementation is included within the web application or is made visible through the container's facilities for shared libraries.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final StringThe property name for theApplicationFactoryclass name.static final StringThe property name for theClientWindowFactoryclass name.static final StringThe property name for theExceptionHandlerFactoryclass name.static final StringThe property name for theExternalContextFactoryclass name.static final StringThe property name for theFaceletCacheFactoryclass name.static final StringThe property name for theFacesContextFactoryclass name.static final StringThe property name for theFlashFactoryclass name.static final StringThe property name for theFlowHandlerFactoryclass name.static final StringThe property name for theLifecycleFactoryclass name.static final StringThe property name for thePartialViewContextFactoryclass name.static final StringThe property name for theRenderKitFactoryclass name.static final StringThe property name for theSearchExpressionContextclass name.static final StringThe property name for theTagHandlerDelegateclass name.static final StringThe property name for theViewDeclarationLanguageclass name.static final StringThe property name for theVisitContextFactoryclass name. -
Method Summary
Modifier and TypeMethodDescriptionstatic ObjectgetFactory(String factoryName) Create (if necessary) and return a per-web-application instance of the appropriate implementation class for the specified Jakarta Server Faces factory class, based on the discovery algorithm described in the class description.static voidRelease any references to factory instances associated with the class loader for the calling web application.static voidsetFactory(String factoryName, String implName) This method will store the argumentfactoryName/implNamemapping in such a way thatgetFactory(java.lang.String)will find this mapping when searching for a match.
-
Field Details
-
APPLICATION_FACTORY
The property name for the
ApplicationFactoryclass name.- See Also:
-
CLIENT_WINDOW_FACTORY
The property name for the
ClientWindowFactoryclass name.- Since:
- 2.2
- See Also:
-
EXCEPTION_HANDLER_FACTORY
The property name for the
ExceptionHandlerFactoryclass name.- See Also:
-
EXTERNAL_CONTEXT_FACTORY
The property name for the
ExternalContextFactoryclass name.- See Also:
-
FACES_CONTEXT_FACTORY
The property name for the
FacesContextFactoryclass name.- See Also:
-
FACELET_CACHE_FACTORY
The property name for the
FaceletCacheFactoryclass name.- Since:
- 2.1
- See Also:
-
FLASH_FACTORY
The property name for the
FlashFactoryclass name.- Since:
- 2.2
- See Also:
-
FLOW_HANDLER_FACTORY
The property name for the
FlowHandlerFactoryclass name.- Since:
- 2.2
- See Also:
-
PARTIAL_VIEW_CONTEXT_FACTORY
The property name for the
PartialViewContextFactoryclass name.- See Also:
-
VISIT_CONTEXT_FACTORY
The property name for the
VisitContextFactoryclass name.- See Also:
-
LIFECYCLE_FACTORY
The property name for the
LifecycleFactoryclass name.- See Also:
-
RENDER_KIT_FACTORY
The property name for the
RenderKitFactoryclass name.- See Also:
-
VIEW_DECLARATION_LANGUAGE_FACTORY
The property name for the
ViewDeclarationLanguageclass name.- See Also:
-
TAG_HANDLER_DELEGATE_FACTORY
The property name for the
TagHandlerDelegateclass name.- See Also:
-
SEARCH_EXPRESSION_CONTEXT_FACTORY
The property name for the
SearchExpressionContextclass name.- See Also:
-
-
Method Details
-
getFactory
Create (if necessary) and return a per-web-application instance of the appropriate implementation class for the specified Jakarta Server Faces factory class, based on the discovery algorithm described in the class description.
The standard injectionProvider and wrappers in Jakarta Server Faces all implement the interface
FacesWrapper. If the returnedObjectis an implementation of one of the standard injectionProvider, it must be legal to cast it to an instance ofFacesWrapperand callFacesWrapper.getWrapped()on the instance.- Parameters:
factoryName- Fully qualified name of the Jakarta Server Faces factory for which an implementation instance is requested- Returns:
- the found factory instance
- Throws:
FacesException- if the web application class loader cannot be identifiedFacesException- if an instance of the configured factory implementation class cannot be loadedFacesException- if an instance of the configured factory implementation class cannot be instantiatedIllegalArgumentException- iffactoryNamedoes not identify a standard Jakarta Server Faces factory nameIllegalStateException- if there is no configured factory implementation class for the specified factory nameNullPointerException- iffactorynameis null
-
setFactory
This method will store the argument
factoryName/implNamemapping in such a way thatgetFactory(java.lang.String)will find this mapping when searching for a match.This method has no effect if
getFactory()has already been called looking for a factory for thisfactoryName.This method can be used by implementations to store a factory mapping while parsing the Faces configuration file
- Parameters:
factoryName- the name to be used in a subsequent call togetFactory(java.lang.String).implName- the fully qualified class name of the factory corresponding tofactoryName.- Throws:
IllegalArgumentException- iffactoryNamedoes not identify a standard Jakarta Server Faces factory nameNullPointerException- iffactorynameis null
-
releaseFactories
Release any references to factory instances associated with the class loader for the calling web application. This method must be called during of web application shutdown.
- Throws:
FacesException- if the web application class loader cannot be identified
-