You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2020/02/27 11:59:24 UTC
[myfaces] branch 3.0.x updated: first patch to jakarta.faces
This is an automated email from the ASF dual-hosted git repository.
tandraschko pushed a commit to branch 3.0.x
in repository https://gitbox.apache.org/repos/asf/myfaces.git
The following commit(s) were added to refs/heads/3.0.x by this push:
new 874ae09 first patch to jakarta.faces
874ae09 is described below
commit 874ae09f7669bece70f401601367615803021777
Author: Thomas Andraschko <ta...@apache.org>
AuthorDate: Thu Feb 27 12:59:07 2020 +0100
first patch to jakarta.faces
---
api/pom.xml | 33 +-
.../main/java/jakarta/faces/FacesException.java | 53 +
api/src/main/java/jakarta/faces/FacesWrapper.java | 34 +
api/src/main/java/jakarta/faces/FactoryFinder.java | 817 ++++++
.../faces/_FactoryFinderProviderFactory.java | 238 ++
.../jakarta/faces/annotation/ApplicationMap.java | 37 +
.../java/jakarta/faces/annotation/FacesConfig.java | 44 +
.../java/jakarta/faces/annotation/FlowMap.java | 37 +
.../java/jakarta/faces/annotation/HeaderMap.java | 37 +
.../jakarta/faces/annotation/HeaderValuesMap.java | 37 +
.../jakarta/faces/annotation/InitParameterMap.java | 37 +
.../jakarta/faces/annotation/ManagedProperty.java | 37 +
.../jakarta/faces/annotation/RequestCookieMap.java | 37 +
.../java/jakarta/faces/annotation/RequestMap.java | 37 +
.../faces/annotation/RequestParameterMap.java | 37 +
.../annotation/RequestParameterValuesMap.java | 37 +
.../java/jakarta/faces/annotation/SessionMap.java | 37 +
.../java/jakarta/faces/annotation/ViewMap.java | 37 +
.../jakarta/faces/application/Application.java | 1311 ++++++++++
.../ApplicationConfigurationPopulator.java | 27 +
.../faces/application/ApplicationFactory.java | 58 +
.../faces/application/ApplicationWrapper.java | 492 ++++
.../application/ConfigurableNavigationHandler.java | 73 +
.../ConfigurableNavigationHandlerWrapper.java | 87 +
.../jakarta/faces/application/FacesMessage.java | 295 +++
.../jakarta/faces/application/NavigationCase.java | 354 +++
.../faces/application/NavigationCaseWrapper.java | 137 +
.../faces/application/NavigationHandler.java | 46 +
.../application/NavigationHandlerWrapper.java | 63 +
.../jakarta/faces/application/ProjectStage.java | 40 +
.../faces/application/ProtectedViewException.java | 45 +
.../java/jakarta/faces/application/Resource.java | 92 +
.../faces/application/ResourceDependencies.java | 36 +
.../faces/application/ResourceDependency.java | 40 +
.../jakarta/faces/application/ResourceHandler.java | 202 ++
.../faces/application/ResourceHandlerWrapper.java | 162 ++
.../faces/application/ResourceVisitOption.java | 28 +
.../jakarta/faces/application/ResourceWrapper.java | 118 +
.../jakarta/faces/application/StateManager.java | 352 +++
.../faces/application/StateManagerWrapper.java | 121 +
.../faces/application/ViewExpiredException.java | 63 +
.../jakarta/faces/application/ViewHandler.java | 450 ++++
.../faces/application/ViewHandlerWrapper.java | 187 ++
.../jakarta/faces/application/ViewResource.java | 34 +
.../jakarta/faces/application/ViewVisitOption.java | 29 +
.../faces/application/_NavigationUtils.java | 104 +
.../java/jakarta/faces/bean/ApplicationScoped.java | 37 +
.../main/java/jakarta/faces/bean/CustomScoped.java | 36 +
.../main/java/jakarta/faces/bean/ManagedBean.java | 45 +
.../java/jakarta/faces/bean/ManagedProperty.java | 42 +
.../main/java/jakarta/faces/bean/NoneScoped.java | 36 +
.../java/jakarta/faces/bean/ReferencedBean.java | 36 +
.../java/jakarta/faces/bean/RequestScoped.java | 36 +
.../java/jakarta/faces/bean/SessionScoped.java | 36 +
.../main/java/jakarta/faces/bean/ViewScoped.java | 36 +
.../main/java/jakarta/faces/bean/package-info.java | 20 +
.../java/jakarta/faces/component/ActionSource.java | 55 +
.../jakarta/faces/component/ActionSource2.java | 33 +
.../jakarta/faces/component/ContextCallback.java | 36 +
.../faces/component/EditableValueHolder.java | 180 ++
.../jakarta/faces/component/FacesComponent.java | 44 +
.../jakarta/faces/component/NamingContainer.java | 65 +
.../faces/component/PartialStateHolder.java | 31 +
.../java/jakarta/faces/component/StateHelper.java | 43 +
.../java/jakarta/faces/component/StateHolder.java | 36 +
.../faces/component/TransientStateHelper.java | 70 +
.../faces/component/TransientStateHolder.java | 64 +
.../java/jakarta/faces/component/UIColumn.java | 82 +
.../java/jakarta/faces/component/UICommand.java | 263 ++
.../java/jakarta/faces/component/UIComponent.java | 1837 ++++++++++++++
.../jakarta/faces/component/UIComponentBase.java | 2670 ++++++++++++++++++++
.../main/java/jakarta/faces/component/UIData.java | 2505 ++++++++++++++++++
.../main/java/jakarta/faces/component/UIForm.java | 480 ++++
.../java/jakarta/faces/component/UIGraphic.java | 150 ++
.../jakarta/faces/component/UIImportConstants.java | 88 +
.../main/java/jakarta/faces/component/UIInput.java | 1432 +++++++++++
.../jakarta/faces/component/UINamingContainer.java | 208 ++
.../jakarta/faces/component/UIOutcomeTarget.java | 102 +
.../java/jakarta/faces/component/UIOutput.java | 345 +++
.../main/java/jakarta/faces/component/UIPanel.java | 47 +
.../jakarta/faces/component/UISelectBoolean.java | 150 ++
.../java/jakarta/faces/component/UISelectMany.java | 474 ++++
.../java/jakarta/faces/component/UISelectOne.java | 213 ++
.../java/jakarta/faces/component/UIViewAction.java | 432 ++++
.../jakarta/faces/component/UIViewParameter.java | 353 +++
.../java/jakarta/faces/component/UIViewRoot.java | 2065 +++++++++++++++
.../jakarta/faces/component/UniqueIdVendor.java | 29 +
.../faces/component/UpdateModelException.java | 45 +
.../java/jakarta/faces/component/ValueHolder.java | 37 +
.../java/jakarta/faces/component/_ArrayMap.java | 637 +++++
.../component/_AttachedCollectionStateWrapper.java | 46 +
.../faces/component/_AttachedDeltaWrapper.java | 48 +
.../faces/component/_AttachedListStateWrapper.java | 39 +
.../faces/component/_AttachedStateWrapper.java | 54 +
.../faces/component/_BeanValidationUtils.java | 35 +
.../java/jakarta/faces/component/_ClassUtils.java | 415 +++
.../faces/component/_ComponentAttributesMap.java | 786 ++++++
.../faces/component/_ComponentChildrenList.java | 209 ++
.../faces/component/_ComponentFacetMap.java | 667 +++++
.../jakarta/faces/component/_ComponentUtils.java | 460 ++++
.../java/jakarta/faces/component/_DeltaList.java | 308 +++
.../jakarta/faces/component/_DeltaStateHelper.java | 1118 ++++++++
.../jakarta/faces/component/_EmptyIterator.java | 43 +
.../faces/component/_ExternalSpecifications.java | 84 +
.../component/_FacetsAndChildrenIterator.java | 73 +
.../faces/component/_LabeledFacesMessage.java | 71 +
.../java/jakarta/faces/component/_LocaleUtils.java | 346 +++
.../jakarta/faces/component/_MessageUtils.java | 229 ++
.../component/_MethodBindingToActionListener.java | 47 +
.../faces/component/_MethodBindingToListener.java | 121 +
.../_MethodBindingToMethodExpression.java | 263 ++
.../_MethodBindingToValueChangeListener.java | 48 +
.../_MethodExpressionToMethodBinding.java | 128 +
.../component/_ParametrizableFacesMessage.java | 157 ++
.../faces/component/_PassThroughAttributesMap.java | 139 +
.../faces/component/_PrimitiveArrayIterator.java | 59 +
.../faces/component/_PropertyDescriptorHolder.java | 79 +
.../faces/component/_SelectItemsIterator.java | 385 +++
.../jakarta/faces/component/_SelectItemsUtil.java | 170 ++
.../faces/component/_SharedRendererUtils.java | 494 ++++
.../java/jakarta/faces/component/_UIMessage.java | 84 +
.../java/jakarta/faces/component/_UIMessages.java | 92 +
.../java/jakarta/faces/component/_UIParameter.java | 98 +
.../jakarta/faces/component/_UISelectItem.java | 138 +
.../jakarta/faces/component/_UISelectItems.java | 178 ++
.../java/jakarta/faces/component/_UIWebsocket.java | 90 +
.../jakarta/faces/component/_ValidationUtils.java | 35 +
.../component/_ValueBindingToValueExpression.java | 294 +++
.../component/_ValueExpressionToValueBinding.java | 249 ++
.../jakarta/faces/component/_ViewAttributeMap.java | 178 ++
.../faces/component/behavior/AjaxBehavior.java | 413 +++
.../jakarta/faces/component/behavior/Behavior.java | 29 +
.../faces/component/behavior/BehaviorBase.java | 287 +++
.../faces/component/behavior/ClientBehavior.java | 36 +
.../component/behavior/ClientBehaviorBase.java | 150 ++
.../component/behavior/ClientBehaviorContext.java | 152 ++
.../component/behavior/ClientBehaviorHint.java | 27 +
.../component/behavior/ClientBehaviorHolder.java | 42 +
.../faces/component/behavior/FacesBehavior.java | 40 +
.../behavior/_AjaxBehaviorDeltaStateHelper.java | 710 ++++++
.../component/behavior/_AttachedDeltaWrapper.java | 48 +
.../behavior/_AttachedListStateWrapper.java | 39 +
.../component/behavior/_AttachedStateWrapper.java | 54 +
.../faces/component/behavior/_DeltaList.java | 311 +++
.../component/behavior/_DeltaStateHelper.java | 921 +++++++
.../faces/component/html/HtmlInputHidden.java | 63 +
.../faces/component/html/_AccesskeyProperty.java | 32 +
.../jakarta/faces/component/html/_AltProperty.java | 31 +
.../faces/component/html/_ChangeProperty.java | 32 +
.../jakarta/faces/component/html/_ClassUtils.java | 415 +++
.../component/html/_CommonEventConstants.java | 89 +
.../component/html/_CommonPropertyConstants.java | 206 ++
.../html/_DisabledClassEnabledClassProperties.java | 39 +
.../html/_DisabledReadonlyProperties.java | 39 +
.../faces/component/html/_EscapeProperty.java | 32 +
.../faces/component/html/_EventProperties.java | 96 +
.../faces/component/html/_FocusBlurProperties.java | 40 +
.../jakarta/faces/component/html/_HtmlBody.java | 95 +
.../jakarta/faces/component/html/_HtmlColumn.java | 90 +
.../faces/component/html/_HtmlCommandButton.java | 64 +
.../faces/component/html/_HtmlCommandLink.java | 58 +
.../faces/component/html/_HtmlCommandScript.java | 65 +
.../faces/component/html/_HtmlDataTable.java | 193 ++
.../jakarta/faces/component/html/_HtmlDoctype.java | 59 +
.../jakarta/faces/component/html/_HtmlForm.java | 90 +
.../faces/component/html/_HtmlGraphicImage.java | 107 +
.../jakarta/faces/component/html/_HtmlHead.java | 93 +
.../faces/component/html/_HtmlInputFile.java | 157 ++
.../faces/component/html/_HtmlInputSecret.java | 86 +
.../faces/component/html/_HtmlInputText.java | 77 +
.../faces/component/html/_HtmlInputTextarea.java | 65 +
.../jakarta/faces/component/html/_HtmlMessage.java | 45 +
.../faces/component/html/_HtmlMessages.java | 61 +
.../component/html/_HtmlOutcomeTargetButton.java | 65 +
.../component/html/_HtmlOutcomeTargetLink.java | 46 +
.../faces/component/html/_HtmlOutputFormat.java | 45 +
.../faces/component/html/_HtmlOutputLabel.java | 54 +
.../faces/component/html/_HtmlOutputLink.java | 56 +
.../faces/component/html/_HtmlOutputText.java | 45 +
.../faces/component/html/_HtmlPanelGrid.java | 188 ++
.../faces/component/html/_HtmlPanelGroup.java | 55 +
.../component/html/_HtmlSelectBooleanCheckbox.java | 55 +
.../component/html/_HtmlSelectManyCheckbox.java | 105 +
.../component/html/_HtmlSelectManyListbox.java | 81 +
.../faces/component/html/_HtmlSelectManyMenu.java | 70 +
.../component/html/_HtmlSelectOneListbox.java | 79 +
.../faces/component/html/_HtmlSelectOneMenu.java | 65 +
.../faces/component/html/_HtmlSelectOneRadio.java | 88 +
.../faces/component/html/_LabelProperty.java | 33 +
.../faces/component/html/_LinkProperties.java | 92 +
.../faces/component/html/_MessageProperties.java | 88 +
.../faces/component/html/_MessageUtils.java | 230 ++
.../html/_ParametrizableFacesMessage.java | 157 ++
.../faces/component/html/_RoleProperty.java | 31 +
.../faces/component/html/_SelectProperty.java | 32 +
.../faces/component/html/_StyleProperties.java | 39 +
.../faces/component/html/_TabindexProperty.java | 32 +
.../faces/component/html/_TitleProperty.java | 31 +
.../faces/component/html/_UniversalProperties.java | 47 +
.../search/ComponentNotFoundException.java | 48 +
.../component/search/SearchExpressionContext.java | 57 +
.../search/SearchExpressionContextFactory.java | 47 +
.../component/search/SearchExpressionHandler.java | 69 +
.../search/SearchExpressionHandlerWrapper.java | 110 +
.../component/search/SearchExpressionHint.java | 42 +
.../component/search/SearchKeywordContext.java | 75 +
.../component/search/SearchKeywordResolver.java | 66 +
.../component/search/UntargetableComponent.java | 27 +
.../faces/component/visit/VisitCallback.java | 49 +
.../faces/component/visit/VisitContext.java | 128 +
.../faces/component/visit/VisitContextFactory.java | 50 +
.../faces/component/visit/VisitContextWrapper.java | 96 +
.../jakarta/faces/component/visit/VisitHint.java | 56 +
.../jakarta/faces/component/visit/VisitResult.java | 49 +
.../jakarta/faces/context/ExceptionHandler.java | 52 +
.../faces/context/ExceptionHandlerFactory.java | 56 +
.../faces/context/ExceptionHandlerWrapper.java | 91 +
.../jakarta/faces/context/ExternalContext.java | 816 ++++++
.../faces/context/ExternalContextFactory.java | 49 +
.../faces/context/ExternalContextWrapper.java | 519 ++++
.../java/jakarta/faces/context/FacesContext.java | 478 ++++
.../jakarta/faces/context/FacesContextFactory.java | 59 +
.../jakarta/faces/context/FacesContextWrapper.java | 287 +++
api/src/main/java/jakarta/faces/context/Flash.java | 49 +
.../java/jakarta/faces/context/FlashFactory.java | 46 +
.../java/jakarta/faces/context/FlashWrapper.java | 156 ++
.../faces/context/PartialResponseWriter.java | 269 ++
.../jakarta/faces/context/PartialViewContext.java | 82 +
.../faces/context/PartialViewContextFactory.java | 46 +
.../faces/context/PartialViewContextWrapper.java | 135 +
.../jakarta/faces/context/RequestCookieMap.java | 39 +
.../java/jakarta/faces/context/ResponseStream.java | 29 +
.../java/jakarta/faces/context/ResponseWriter.java | 94 +
.../faces/context/ResponseWriterWrapper.java | 170 ++
.../java/jakarta/faces/context/SessionMap.java | 39 +
.../context/_MyFacesExternalContextHelper.java | 54 +
.../jakarta/faces/convert/BigDecimalConverter.java | 109 +
.../jakarta/faces/convert/BigIntegerConverter.java | 107 +
.../jakarta/faces/convert/BooleanConverter.java | 104 +
.../java/jakarta/faces/convert/ByteConverter.java | 105 +
.../jakarta/faces/convert/CharacterConverter.java | 105 +
.../main/java/jakarta/faces/convert/Converter.java | 44 +
.../jakarta/faces/convert/ConverterException.java | 73 +
.../jakarta/faces/convert/DateTimeConverter.java | 654 +++++
.../jakarta/faces/convert/DoubleConverter.java | 193 ++
.../java/jakarta/faces/convert/EnumConverter.java | 218 ++
.../java/jakarta/faces/convert/FacesConverter.java | 51 +
.../java/jakarta/faces/convert/FloatConverter.java | 104 +
.../jakarta/faces/convert/IntegerConverter.java | 104 +
.../java/jakarta/faces/convert/LongConverter.java | 104 +
.../jakarta/faces/convert/NumberConverter.java | 599 +++++
.../java/jakarta/faces/convert/ShortConverter.java | 104 +
.../faces/convert/_LabeledFacesMessage.java | 73 +
.../java/jakarta/faces/convert/_MessageUtils.java | 231 ++
.../faces/convert/_ParametrizableFacesMessage.java | 157 ++
.../el/CompositeComponentExpressionHolder.java | 30 +
.../java/jakarta/faces/el/EvaluationException.java | 66 +
.../main/java/jakarta/faces/el/MethodBinding.java | 63 +
.../jakarta/faces/el/MethodNotFoundException.java | 64 +
.../faces/el/PropertyNotFoundException.java | 64 +
.../java/jakarta/faces/el/PropertyResolver.java | 130 +
.../jakarta/faces/el/ReferenceSyntaxException.java | 64 +
.../main/java/jakarta/faces/el/ValueBinding.java | 58 +
.../java/jakarta/faces/el/VariableResolver.java | 45 +
.../faces/event/AbortProcessingException.java | 49 +
.../main/java/jakarta/faces/event/ActionEvent.java | 61 +
.../java/jakarta/faces/event/ActionListener.java | 32 +
.../jakarta/faces/event/ActionListenerWrapper.java | 32 +
.../jakarta/faces/event/AjaxBehaviorEvent.java | 63 +
.../jakarta/faces/event/AjaxBehaviorListener.java | 27 +
.../java/jakarta/faces/event/BehaviorEvent.java | 56 +
.../java/jakarta/faces/event/BehaviorListener.java | 27 +
.../jakarta/faces/event/ComponentSystemEvent.java | 64 +
.../faces/event/ComponentSystemEventListener.java | 28 +
.../jakarta/faces/event/ExceptionQueuedEvent.java | 45 +
.../faces/event/ExceptionQueuedEventContext.java | 110 +
.../main/java/jakarta/faces/event/FacesEvent.java | 89 +
.../java/jakarta/faces/event/FacesListener.java | 28 +
.../main/java/jakarta/faces/event/ListenerFor.java | 41 +
.../java/jakarta/faces/event/ListenersFor.java | 36 +
.../event/MethodExpressionActionListener.java | 185 ++
.../event/MethodExpressionValueChangeListener.java | 185 ++
.../main/java/jakarta/faces/event/NamedEvent.java | 38 +
.../main/java/jakarta/faces/event/PhaseEvent.java | 131 +
api/src/main/java/jakarta/faces/event/PhaseId.java | 115 +
.../java/jakarta/faces/event/PhaseListener.java | 31 +
.../jakarta/faces/event/PostAddToViewEvent.java | 53 +
.../faces/event/PostConstructApplicationEvent.java | 52 +
.../faces/event/PostConstructCustomScopeEvent.java | 52 +
.../faces/event/PostConstructViewMapEvent.java | 44 +
.../faces/event/PostKeepFlashValueEvent.java | 45 +
.../faces/event/PostPutFlashValueEvent.java | 45 +
.../jakarta/faces/event/PostRenderViewEvent.java | 42 +
.../jakarta/faces/event/PostRestoreStateEvent.java | 49 +
.../jakarta/faces/event/PostValidateEvent.java | 44 +
.../jakarta/faces/event/PreClearFlashEvent.java | 39 +
.../faces/event/PreDestroyApplicationEvent.java | 52 +
.../faces/event/PreDestroyCustomScopeEvent.java | 50 +
.../faces/event/PreDestroyViewMapEvent.java | 44 +
.../faces/event/PreRemoveFlashValueEvent.java | 45 +
.../faces/event/PreRemoveFromViewEvent.java | 53 +
.../faces/event/PreRenderComponentEvent.java | 44 +
.../jakarta/faces/event/PreRenderViewEvent.java | 44 +
.../java/jakarta/faces/event/PreValidateEvent.java | 44 +
.../java/jakarta/faces/event/ScopeContext.java | 56 +
.../main/java/jakarta/faces/event/SystemEvent.java | 63 +
.../jakarta/faces/event/SystemEventListener.java | 29 +
.../faces/event/SystemEventListenerHolder.java | 29 +
.../java/jakarta/faces/event/ValueChangeEvent.java | 79 +
.../jakarta/faces/event/ValueChangeListener.java | 27 +
.../java/jakarta/faces/event/ViewMapListener.java | 26 +
.../java/jakarta/faces/event/WebsocketEvent.java | 121 +
api/src/main/java/jakarta/faces/flow/Flow.java | 64 +
.../main/java/jakarta/faces/flow/FlowCallNode.java | 35 +
.../main/java/jakarta/faces/flow/FlowHandler.java | 62 +
.../jakarta/faces/flow/FlowHandlerFactory.java | 30 +
.../faces/flow/FlowHandlerFactoryWrapper.java | 51 +
api/src/main/java/jakarta/faces/flow/FlowNode.java | 28 +
.../main/java/jakarta/faces/flow/FlowScoped.java | 43 +
.../java/jakarta/faces/flow/MethodCallNode.java | 34 +
.../main/java/jakarta/faces/flow/Parameter.java | 31 +
.../main/java/jakarta/faces/flow/ReturnNode.java | 31 +
.../main/java/jakarta/faces/flow/SwitchCase.java | 32 +
.../main/java/jakarta/faces/flow/SwitchNode.java | 34 +
api/src/main/java/jakarta/faces/flow/ViewNode.java | 28 +
.../jakarta/faces/flow/builder/FlowBuilder.java | 61 +
.../faces/flow/builder/FlowBuilderParameter.java | 39 +
.../faces/flow/builder/FlowCallBuilder.java | 38 +
.../jakarta/faces/flow/builder/FlowDefinition.java | 37 +
.../faces/flow/builder/MethodCallBuilder.java | 46 +
.../faces/flow/builder/NavigationCaseBuilder.java | 52 +
.../jakarta/faces/flow/builder/NodeBuilder.java | 28 +
.../jakarta/faces/flow/builder/ReturnBuilder.java | 33 +
.../jakarta/faces/flow/builder/SwitchBuilder.java | 34 +
.../faces/flow/builder/SwitchCaseBuilder.java | 34 +
.../jakarta/faces/flow/builder/ViewBuilder.java | 28 +
.../java/jakarta/faces/lifecycle/ClientWindow.java | 58 +
.../faces/lifecycle/ClientWindowFactory.java | 48 +
.../faces/lifecycle/ClientWindowWrapper.java | 79 +
.../java/jakarta/faces/lifecycle/Lifecycle.java | 51 +
.../jakarta/faces/lifecycle/LifecycleFactory.java | 66 +
.../jakarta/faces/lifecycle/LifecycleWrapper.java | 75 +
.../java/jakarta/faces/model/ArrayDataModel.java | 125 +
.../jakarta/faces/model/CollectionDataModel.java | 128 +
.../main/java/jakarta/faces/model/DataModel.java | 214 ++
.../java/jakarta/faces/model/DataModelEvent.java | 56 +
.../jakarta/faces/model/DataModelListener.java | 27 +
.../java/jakarta/faces/model/FacesDataModel.java | 39 +
.../jakarta/faces/model/IterableDataModel.java | 181 ++
.../java/jakarta/faces/model/ListDataModel.java | 128 +
.../java/jakarta/faces/model/ResultDataModel.java | 140 +
.../jakarta/faces/model/ResultSetDataModel.java | 773 ++++++
.../java/jakarta/faces/model/ScalarDataModel.java | 117 +
.../main/java/jakarta/faces/model/SelectItem.java | 167 ++
.../java/jakarta/faces/model/SelectItemGroup.java | 70 +
api/src/main/java/jakarta/faces/push/Push.java | 37 +
.../main/java/jakarta/faces/push/PushContext.java | 45 +
.../faces/render/ClientBehaviorRenderer.java | 54 +
.../faces/render/FacesBehaviorRenderer.java | 47 +
.../java/jakarta/faces/render/FacesRenderer.java | 51 +
.../main/java/jakarta/faces/render/RenderKit.java | 132 +
.../jakarta/faces/render/RenderKitFactory.java | 67 +
.../jakarta/faces/render/RenderKitWrapper.java | 126 +
.../main/java/jakarta/faces/render/Renderer.java | 158 ++
.../java/jakarta/faces/render/RendererWrapper.java | 87 +
.../jakarta/faces/render/ResponseStateManager.java | 150 ++
.../jakarta/faces/validator/BeanValidator.java | 685 +++++
.../faces/validator/DoubleRangeValidator.java | 294 +++
.../jakarta/faces/validator/FacesValidator.java | 52 +
.../jakarta/faces/validator/LengthValidator.java | 263 ++
.../faces/validator/LongRangeValidator.java | 290 +++
.../faces/validator/MethodExpressionValidator.java | 131 +
.../jakarta/faces/validator/RegexValidator.java | 263 ++
.../jakarta/faces/validator/RequiredValidator.java | 103 +
.../java/jakarta/faces/validator/Validator.java | 36 +
.../faces/validator/ValidatorException.java | 120 +
.../faces/validator/_ExternalSpecifications.java | 84 +
.../faces/validator/_LabeledFacesMessage.java | 72 +
.../jakarta/faces/validator/_MessageUtils.java | 234 ++
.../validator/_ParametrizableFacesMessage.java | 156 ++
.../jakarta/faces/validator/_ValidationUtils.java | 35 +
.../view/ActionSource2AttachedObjectHandler.java | 31 +
.../view/ActionSource2AttachedObjectTarget.java | 30 +
.../jakarta/faces/view/AttachedObjectHandler.java | 53 +
.../jakarta/faces/view/AttachedObjectTarget.java | 39 +
.../view/BehaviorHolderAttachedObjectHandler.java | 27 +
.../view/BehaviorHolderAttachedObjectTarget.java | 27 +
.../EditableValueHolderAttachedObjectHandler.java | 33 +
.../EditableValueHolderAttachedObjectTarget.java | 30 +
api/src/main/java/jakarta/faces/view/Location.java | 58 +
.../faces/view/StateManagementStrategy.java | 32 +
.../view/ValueHolderAttachedObjectHandler.java | 31 +
.../view/ValueHolderAttachedObjectTarget.java | 30 +
.../faces/view/ViewDeclarationLanguage.java | 178 ++
.../faces/view/ViewDeclarationLanguageFactory.java | 66 +
.../faces/view/ViewDeclarationLanguageWrapper.java | 142 ++
.../main/java/jakarta/faces/view/ViewMetadata.java | 204 ++
.../main/java/jakarta/faces/view/ViewScoped.java | 42 +
.../faces/view/facelets/AttributeHandler.java | 27 +
.../faces/view/facelets/BehaviorConfig.java | 27 +
.../faces/view/facelets/BehaviorHandler.java | 81 +
.../faces/view/facelets/ComponentConfig.java | 29 +
.../faces/view/facelets/ComponentHandler.java | 129 +
.../view/facelets/CompositeFaceletHandler.java | 54 +
.../faces/view/facelets/ConverterConfig.java | 27 +
.../faces/view/facelets/ConverterHandler.java | 64 +
.../view/facelets/DelegatingMetaTagHandler.java | 107 +
.../java/jakarta/faces/view/facelets/Facelet.java | 46 +
.../jakarta/faces/view/facelets/FaceletCache.java | 82 +
.../faces/view/facelets/FaceletCacheFactory.java | 47 +
.../faces/view/facelets/FaceletContext.java | 119 +
.../faces/view/facelets/FaceletException.java | 47 +
.../faces/view/facelets/FaceletHandler.java | 43 +
.../facelets/FaceletsAttachedObjectHandler.java | 72 +
.../view/facelets/FaceletsResourceResolver.java | 33 +
.../jakarta/faces/view/facelets/FacetHandler.java | 27 +
.../java/jakarta/faces/view/facelets/MetaRule.java | 33 +
.../jakarta/faces/view/facelets/MetaRuleset.java | 61 +
.../faces/view/facelets/MetaTagHandler.java | 66 +
.../java/jakarta/faces/view/facelets/Metadata.java | 31 +
.../faces/view/facelets/MetadataTarget.java | 63 +
.../faces/view/facelets/ResourceResolver.java | 36 +
.../main/java/jakarta/faces/view/facelets/Tag.java | 111 +
.../jakarta/faces/view/facelets/TagAttribute.java | 182 ++
.../faces/view/facelets/TagAttributeException.java | 89 +
.../jakarta/faces/view/facelets/TagAttributes.java | 94 +
.../jakarta/faces/view/facelets/TagConfig.java | 31 +
.../jakarta/faces/view/facelets/TagDecorator.java | 29 +
.../jakarta/faces/view/facelets/TagException.java | 64 +
.../jakarta/faces/view/facelets/TagHandler.java | 79 +
.../faces/view/facelets/TagHandlerDelegate.java | 33 +
.../view/facelets/TagHandlerDelegateFactory.java | 56 +
.../jakarta/faces/view/facelets/TextHandler.java | 29 +
.../faces/view/facelets/ValidatorConfig.java | 27 +
.../faces/view/facelets/ValidatorHandler.java | 65 +
.../java/jakarta/faces/webapp/AttributeTag.java | 132 +
.../java/jakarta/faces/webapp/ConverterELTag.java | 66 +
.../java/jakarta/faces/webapp/ConverterTag.java | 131 +
.../java/jakarta/faces/webapp/FacesServlet.java | 256 ++
.../main/java/jakarta/faces/webapp/FacetTag.java | 67 +
.../webapp/PreJsf2ExceptionHandlerFactory.java | 294 +++
.../jakarta/faces/webapp/UIComponentBodyTag.java | 29 +
.../faces/webapp/UIComponentClassicTagBase.java | 1368 ++++++++++
.../jakarta/faces/webapp/UIComponentELTag.java | 136 +
.../java/jakarta/faces/webapp/UIComponentTag.java | 363 +++
.../jakarta/faces/webapp/UIComponentTagBase.java | 108 +
.../java/jakarta/faces/webapp/ValidatorELTag.java | 64 +
.../java/jakarta/faces/webapp/ValidatorTag.java | 131 +
.../faces/webapp/_PageContextOutWriter.java | 79 +
api/src/main/java/javax/faces/FacesException.java | 53 -
api/src/main/java/javax/faces/FacesWrapper.java | 34 -
api/src/main/java/javax/faces/FactoryFinder.java | 817 ------
.../javax/faces/_FactoryFinderProviderFactory.java | 238 --
.../javax/faces/annotation/ApplicationMap.java | 37 -
.../java/javax/faces/annotation/FacesConfig.java | 44 -
.../main/java/javax/faces/annotation/FlowMap.java | 37 -
.../java/javax/faces/annotation/HeaderMap.java | 37 -
.../javax/faces/annotation/HeaderValuesMap.java | 37 -
.../javax/faces/annotation/InitParameterMap.java | 37 -
.../javax/faces/annotation/ManagedProperty.java | 37 -
.../javax/faces/annotation/RequestCookieMap.java | 37 -
.../java/javax/faces/annotation/RequestMap.java | 37 -
.../faces/annotation/RequestParameterMap.java | 37 -
.../annotation/RequestParameterValuesMap.java | 37 -
.../java/javax/faces/annotation/SessionMap.java | 37 -
.../main/java/javax/faces/annotation/ViewMap.java | 37 -
.../java/javax/faces/application/Application.java | 1309 ----------
.../ApplicationConfigurationPopulator.java | 27 -
.../faces/application/ApplicationFactory.java | 58 -
.../faces/application/ApplicationWrapper.java | 491 ----
.../application/ConfigurableNavigationHandler.java | 73 -
.../ConfigurableNavigationHandlerWrapper.java | 87 -
.../java/javax/faces/application/FacesMessage.java | 295 ---
.../javax/faces/application/NavigationCase.java | 354 ---
.../faces/application/NavigationCaseWrapper.java | 137 -
.../javax/faces/application/NavigationHandler.java | 46 -
.../application/NavigationHandlerWrapper.java | 63 -
.../java/javax/faces/application/ProjectStage.java | 40 -
.../faces/application/ProtectedViewException.java | 45 -
.../java/javax/faces/application/Resource.java | 92 -
.../faces/application/ResourceDependencies.java | 36 -
.../faces/application/ResourceDependency.java | 40 -
.../javax/faces/application/ResourceHandler.java | 202 --
.../faces/application/ResourceHandlerWrapper.java | 162 --
.../faces/application/ResourceVisitOption.java | 28 -
.../javax/faces/application/ResourceWrapper.java | 118 -
.../java/javax/faces/application/StateManager.java | 352 ---
.../faces/application/StateManagerWrapper.java | 121 -
.../faces/application/ViewExpiredException.java | 63 -
.../java/javax/faces/application/ViewHandler.java | 450 ----
.../faces/application/ViewHandlerWrapper.java | 187 --
.../java/javax/faces/application/ViewResource.java | 34 -
.../javax/faces/application/ViewVisitOption.java | 29 -
.../javax/faces/application/_NavigationUtils.java | 104 -
.../java/javax/faces/bean/ApplicationScoped.java | 37 -
.../main/java/javax/faces/bean/CustomScoped.java | 36 -
.../main/java/javax/faces/bean/ManagedBean.java | 45 -
.../java/javax/faces/bean/ManagedProperty.java | 42 -
api/src/main/java/javax/faces/bean/NoneScoped.java | 36 -
.../main/java/javax/faces/bean/ReferencedBean.java | 36 -
.../main/java/javax/faces/bean/RequestScoped.java | 36 -
.../main/java/javax/faces/bean/SessionScoped.java | 36 -
api/src/main/java/javax/faces/bean/ViewScoped.java | 36 -
.../main/java/javax/faces/bean/package-info.java | 20 -
.../java/javax/faces/component/ActionSource.java | 52 -
.../java/javax/faces/component/ActionSource2.java | 33 -
.../javax/faces/component/ContextCallback.java | 36 -
.../javax/faces/component/EditableValueHolder.java | 180 --
.../java/javax/faces/component/FacesComponent.java | 44 -
.../javax/faces/component/NamingContainer.java | 63 -
.../javax/faces/component/PartialStateHolder.java | 31 -
.../java/javax/faces/component/StateHelper.java | 43 -
.../java/javax/faces/component/StateHolder.java | 34 -
.../faces/component/TransientStateHelper.java | 70 -
.../faces/component/TransientStateHolder.java | 62 -
.../main/java/javax/faces/component/UIColumn.java | 82 -
.../main/java/javax/faces/component/UICommand.java | 263 --
.../java/javax/faces/component/UIComponent.java | 1834 --------------
.../javax/faces/component/UIComponentBase.java | 2668 -------------------
.../main/java/javax/faces/component/UIData.java | 2505 ------------------
.../main/java/javax/faces/component/UIForm.java | 480 ----
.../main/java/javax/faces/component/UIGraphic.java | 150 --
.../javax/faces/component/UIImportConstants.java | 88 -
.../main/java/javax/faces/component/UIInput.java | 1430 -----------
.../javax/faces/component/UINamingContainer.java | 208 --
.../javax/faces/component/UIOutcomeTarget.java | 102 -
.../main/java/javax/faces/component/UIOutput.java | 345 ---
.../main/java/javax/faces/component/UIPanel.java | 47 -
.../javax/faces/component/UISelectBoolean.java | 150 --
.../java/javax/faces/component/UISelectMany.java | 474 ----
.../java/javax/faces/component/UISelectOne.java | 213 --
.../java/javax/faces/component/UIViewAction.java | 432 ----
.../javax/faces/component/UIViewParameter.java | 353 ---
.../java/javax/faces/component/UIViewRoot.java | 2065 ---------------
.../java/javax/faces/component/UniqueIdVendor.java | 29 -
.../faces/component/UpdateModelException.java | 45 -
.../java/javax/faces/component/ValueHolder.java | 37 -
.../main/java/javax/faces/component/_ArrayMap.java | 637 -----
.../component/_AttachedCollectionStateWrapper.java | 46 -
.../faces/component/_AttachedDeltaWrapper.java | 48 -
.../faces/component/_AttachedListStateWrapper.java | 39 -
.../faces/component/_AttachedStateWrapper.java | 54 -
.../faces/component/_BeanValidationUtils.java | 35 -
.../java/javax/faces/component/_ClassUtils.java | 414 ---
.../faces/component/_ComponentAttributesMap.java | 785 ------
.../faces/component/_ComponentChildrenList.java | 209 --
.../javax/faces/component/_ComponentFacetMap.java | 667 -----
.../javax/faces/component/_ComponentUtils.java | 459 ----
.../java/javax/faces/component/_DeltaList.java | 308 ---
.../javax/faces/component/_DeltaStateHelper.java | 1117 --------
.../java/javax/faces/component/_EmptyIterator.java | 43 -
.../faces/component/_ExternalSpecifications.java | 84 -
.../component/_FacetsAndChildrenIterator.java | 73 -
.../faces/component/_LabeledFacesMessage.java | 70 -
.../java/javax/faces/component/_LocaleUtils.java | 346 ---
.../java/javax/faces/component/_MessageUtils.java | 228 --
.../component/_MethodBindingToActionListener.java | 47 -
.../faces/component/_MethodBindingToListener.java | 121 -
.../_MethodBindingToMethodExpression.java | 262 --
.../_MethodBindingToValueChangeListener.java | 48 -
.../_MethodExpressionToMethodBinding.java | 127 -
.../component/_ParametrizableFacesMessage.java | 156 --
.../faces/component/_PassThroughAttributesMap.java | 139 -
.../faces/component/_PrimitiveArrayIterator.java | 59 -
.../faces/component/_PropertyDescriptorHolder.java | 79 -
.../faces/component/_SelectItemsIterator.java | 384 ---
.../javax/faces/component/_SelectItemsUtil.java | 170 --
.../faces/component/_SharedRendererUtils.java | 493 ----
.../java/javax/faces/component/_UIMessage.java | 84 -
.../java/javax/faces/component/_UIMessages.java | 92 -
.../java/javax/faces/component/_UIParameter.java | 98 -
.../java/javax/faces/component/_UISelectItem.java | 138 -
.../java/javax/faces/component/_UISelectItems.java | 178 --
.../java/javax/faces/component/_UIWebsocket.java | 90 -
.../javax/faces/component/_ValidationUtils.java | 35 -
.../component/_ValueBindingToValueExpression.java | 293 ---
.../component/_ValueExpressionToValueBinding.java | 248 --
.../javax/faces/component/_ViewAttributeMap.java | 179 --
.../faces/component/behavior/AjaxBehavior.java | 413 ---
.../javax/faces/component/behavior/Behavior.java | 29 -
.../faces/component/behavior/BehaviorBase.java | 287 ---
.../faces/component/behavior/ClientBehavior.java | 36 -
.../component/behavior/ClientBehaviorBase.java | 150 --
.../component/behavior/ClientBehaviorContext.java | 152 --
.../component/behavior/ClientBehaviorHint.java | 27 -
.../component/behavior/ClientBehaviorHolder.java | 42 -
.../faces/component/behavior/FacesBehavior.java | 40 -
.../behavior/_AjaxBehaviorDeltaStateHelper.java | 710 ------
.../component/behavior/_AttachedDeltaWrapper.java | 48 -
.../behavior/_AttachedListStateWrapper.java | 39 -
.../component/behavior/_AttachedStateWrapper.java | 54 -
.../javax/faces/component/behavior/_DeltaList.java | 311 ---
.../component/behavior/_DeltaStateHelper.java | 921 -------
.../faces/component/html/HtmlInputHidden.java | 63 -
.../faces/component/html/_AccesskeyProperty.java | 32 -
.../javax/faces/component/html/_AltProperty.java | 31 -
.../faces/component/html/_ChangeProperty.java | 32 -
.../javax/faces/component/html/_ClassUtils.java | 414 ---
.../component/html/_CommonEventConstants.java | 88 -
.../component/html/_CommonPropertyConstants.java | 206 --
.../html/_DisabledClassEnabledClassProperties.java | 39 -
.../html/_DisabledReadonlyProperties.java | 39 -
.../faces/component/html/_EscapeProperty.java | 32 -
.../faces/component/html/_EventProperties.java | 96 -
.../faces/component/html/_FocusBlurProperties.java | 40 -
.../java/javax/faces/component/html/_HtmlBody.java | 95 -
.../javax/faces/component/html/_HtmlColumn.java | 90 -
.../faces/component/html/_HtmlCommandButton.java | 64 -
.../faces/component/html/_HtmlCommandLink.java | 58 -
.../faces/component/html/_HtmlCommandScript.java | 65 -
.../javax/faces/component/html/_HtmlDataTable.java | 193 --
.../javax/faces/component/html/_HtmlDoctype.java | 59 -
.../java/javax/faces/component/html/_HtmlForm.java | 90 -
.../faces/component/html/_HtmlGraphicImage.java | 107 -
.../java/javax/faces/component/html/_HtmlHead.java | 93 -
.../javax/faces/component/html/_HtmlInputFile.java | 156 --
.../faces/component/html/_HtmlInputSecret.java | 86 -
.../javax/faces/component/html/_HtmlInputText.java | 77 -
.../faces/component/html/_HtmlInputTextarea.java | 65 -
.../javax/faces/component/html/_HtmlMessage.java | 45 -
.../javax/faces/component/html/_HtmlMessages.java | 61 -
.../component/html/_HtmlOutcomeTargetButton.java | 65 -
.../component/html/_HtmlOutcomeTargetLink.java | 46 -
.../faces/component/html/_HtmlOutputFormat.java | 45 -
.../faces/component/html/_HtmlOutputLabel.java | 54 -
.../faces/component/html/_HtmlOutputLink.java | 56 -
.../faces/component/html/_HtmlOutputText.java | 45 -
.../javax/faces/component/html/_HtmlPanelGrid.java | 188 --
.../faces/component/html/_HtmlPanelGroup.java | 55 -
.../component/html/_HtmlSelectBooleanCheckbox.java | 55 -
.../component/html/_HtmlSelectManyCheckbox.java | 105 -
.../component/html/_HtmlSelectManyListbox.java | 81 -
.../faces/component/html/_HtmlSelectManyMenu.java | 70 -
.../component/html/_HtmlSelectOneListbox.java | 79 -
.../faces/component/html/_HtmlSelectOneMenu.java | 65 -
.../faces/component/html/_HtmlSelectOneRadio.java | 88 -
.../javax/faces/component/html/_LabelProperty.java | 33 -
.../faces/component/html/_LinkProperties.java | 92 -
.../faces/component/html/_MessageProperties.java | 88 -
.../javax/faces/component/html/_MessageUtils.java | 229 --
.../html/_ParametrizableFacesMessage.java | 156 --
.../javax/faces/component/html/_RoleProperty.java | 31 -
.../faces/component/html/_SelectProperty.java | 32 -
.../faces/component/html/_StyleProperties.java | 39 -
.../faces/component/html/_TabindexProperty.java | 32 -
.../javax/faces/component/html/_TitleProperty.java | 31 -
.../faces/component/html/_UniversalProperties.java | 47 -
.../search/ComponentNotFoundException.java | 48 -
.../component/search/SearchExpressionContext.java | 57 -
.../search/SearchExpressionContextFactory.java | 47 -
.../component/search/SearchExpressionHandler.java | 69 -
.../search/SearchExpressionHandlerWrapper.java | 110 -
.../component/search/SearchExpressionHint.java | 42 -
.../component/search/SearchKeywordContext.java | 75 -
.../component/search/SearchKeywordResolver.java | 66 -
.../component/search/UntargetableComponent.java | 27 -
.../javax/faces/component/visit/VisitCallback.java | 49 -
.../javax/faces/component/visit/VisitContext.java | 128 -
.../faces/component/visit/VisitContextFactory.java | 50 -
.../faces/component/visit/VisitContextWrapper.java | 96 -
.../javax/faces/component/visit/VisitHint.java | 56 -
.../javax/faces/component/visit/VisitResult.java | 49 -
.../java/javax/faces/context/ExceptionHandler.java | 52 -
.../faces/context/ExceptionHandlerFactory.java | 56 -
.../faces/context/ExceptionHandlerWrapper.java | 91 -
.../java/javax/faces/context/ExternalContext.java | 815 ------
.../faces/context/ExternalContextFactory.java | 49 -
.../faces/context/ExternalContextWrapper.java | 519 ----
.../java/javax/faces/context/FacesContext.java | 476 ----
.../javax/faces/context/FacesContextFactory.java | 59 -
.../javax/faces/context/FacesContextWrapper.java | 286 ---
api/src/main/java/javax/faces/context/Flash.java | 49 -
.../java/javax/faces/context/FlashFactory.java | 46 -
.../java/javax/faces/context/FlashWrapper.java | 155 --
.../javax/faces/context/PartialResponseWriter.java | 269 --
.../javax/faces/context/PartialViewContext.java | 82 -
.../faces/context/PartialViewContextFactory.java | 46 -
.../faces/context/PartialViewContextWrapper.java | 135 -
.../java/javax/faces/context/RequestCookieMap.java | 39 -
.../java/javax/faces/context/ResponseStream.java | 29 -
.../java/javax/faces/context/ResponseWriter.java | 94 -
.../javax/faces/context/ResponseWriterWrapper.java | 169 --
.../main/java/javax/faces/context/SessionMap.java | 39 -
.../context/_MyFacesExternalContextHelper.java | 54 -
.../javax/faces/convert/BigDecimalConverter.java | 109 -
.../javax/faces/convert/BigIntegerConverter.java | 107 -
.../java/javax/faces/convert/BooleanConverter.java | 104 -
.../java/javax/faces/convert/ByteConverter.java | 105 -
.../javax/faces/convert/CharacterConverter.java | 105 -
.../main/java/javax/faces/convert/Converter.java | 44 -
.../javax/faces/convert/ConverterException.java | 73 -
.../javax/faces/convert/DateTimeConverter.java | 654 -----
.../java/javax/faces/convert/DoubleConverter.java | 193 --
.../java/javax/faces/convert/EnumConverter.java | 218 --
.../java/javax/faces/convert/FacesConverter.java | 51 -
.../java/javax/faces/convert/FloatConverter.java | 104 -
.../java/javax/faces/convert/IntegerConverter.java | 104 -
.../java/javax/faces/convert/LongConverter.java | 104 -
.../java/javax/faces/convert/NumberConverter.java | 599 -----
.../java/javax/faces/convert/ShortConverter.java | 104 -
.../javax/faces/convert/_LabeledFacesMessage.java | 72 -
.../java/javax/faces/convert/_MessageUtils.java | 229 --
.../faces/convert/_ParametrizableFacesMessage.java | 156 --
.../el/CompositeComponentExpressionHolder.java | 30 -
.../java/javax/faces/el/EvaluationException.java | 66 -
.../main/java/javax/faces/el/MethodBinding.java | 63 -
.../javax/faces/el/MethodNotFoundException.java | 64 -
.../javax/faces/el/PropertyNotFoundException.java | 64 -
.../main/java/javax/faces/el/PropertyResolver.java | 130 -
.../javax/faces/el/ReferenceSyntaxException.java | 64 -
api/src/main/java/javax/faces/el/ValueBinding.java | 58 -
.../main/java/javax/faces/el/VariableResolver.java | 45 -
.../faces/event/AbortProcessingException.java | 49 -
.../main/java/javax/faces/event/ActionEvent.java | 61 -
.../java/javax/faces/event/ActionListener.java | 32 -
.../javax/faces/event/ActionListenerWrapper.java | 32 -
.../java/javax/faces/event/AjaxBehaviorEvent.java | 63 -
.../javax/faces/event/AjaxBehaviorListener.java | 27 -
.../main/java/javax/faces/event/BehaviorEvent.java | 56 -
.../java/javax/faces/event/BehaviorListener.java | 27 -
.../javax/faces/event/ComponentSystemEvent.java | 64 -
.../faces/event/ComponentSystemEventListener.java | 28 -
.../javax/faces/event/ExceptionQueuedEvent.java | 45 -
.../faces/event/ExceptionQueuedEventContext.java | 110 -
.../main/java/javax/faces/event/FacesEvent.java | 89 -
.../main/java/javax/faces/event/FacesListener.java | 28 -
.../main/java/javax/faces/event/ListenerFor.java | 41 -
.../main/java/javax/faces/event/ListenersFor.java | 36 -
.../event/MethodExpressionActionListener.java | 185 --
.../event/MethodExpressionValueChangeListener.java | 185 --
.../main/java/javax/faces/event/NamedEvent.java | 38 -
.../main/java/javax/faces/event/PhaseEvent.java | 130 -
api/src/main/java/javax/faces/event/PhaseId.java | 114 -
.../main/java/javax/faces/event/PhaseListener.java | 31 -
.../java/javax/faces/event/PostAddToViewEvent.java | 53 -
.../faces/event/PostConstructApplicationEvent.java | 52 -
.../faces/event/PostConstructCustomScopeEvent.java | 52 -
.../faces/event/PostConstructViewMapEvent.java | 44 -
.../javax/faces/event/PostKeepFlashValueEvent.java | 45 -
.../javax/faces/event/PostPutFlashValueEvent.java | 45 -
.../javax/faces/event/PostRenderViewEvent.java | 42 -
.../javax/faces/event/PostRestoreStateEvent.java | 49 -
.../java/javax/faces/event/PostValidateEvent.java | 44 -
.../java/javax/faces/event/PreClearFlashEvent.java | 39 -
.../faces/event/PreDestroyApplicationEvent.java | 52 -
.../faces/event/PreDestroyCustomScopeEvent.java | 50 -
.../javax/faces/event/PreDestroyViewMapEvent.java | 44 -
.../faces/event/PreRemoveFlashValueEvent.java | 45 -
.../javax/faces/event/PreRemoveFromViewEvent.java | 53 -
.../javax/faces/event/PreRenderComponentEvent.java | 44 -
.../java/javax/faces/event/PreRenderViewEvent.java | 44 -
.../java/javax/faces/event/PreValidateEvent.java | 44 -
.../main/java/javax/faces/event/ScopeContext.java | 56 -
.../main/java/javax/faces/event/SystemEvent.java | 63 -
.../javax/faces/event/SystemEventListener.java | 29 -
.../faces/event/SystemEventListenerHolder.java | 29 -
.../java/javax/faces/event/ValueChangeEvent.java | 79 -
.../javax/faces/event/ValueChangeListener.java | 27 -
.../java/javax/faces/event/ViewMapListener.java | 26 -
.../java/javax/faces/event/WebsocketEvent.java | 121 -
api/src/main/java/javax/faces/flow/Flow.java | 63 -
.../main/java/javax/faces/flow/FlowCallNode.java | 35 -
.../main/java/javax/faces/flow/FlowHandler.java | 62 -
.../java/javax/faces/flow/FlowHandlerFactory.java | 30 -
.../faces/flow/FlowHandlerFactoryWrapper.java | 51 -
api/src/main/java/javax/faces/flow/FlowNode.java | 28 -
api/src/main/java/javax/faces/flow/FlowScoped.java | 43 -
.../main/java/javax/faces/flow/MethodCallNode.java | 34 -
api/src/main/java/javax/faces/flow/Parameter.java | 31 -
api/src/main/java/javax/faces/flow/ReturnNode.java | 31 -
api/src/main/java/javax/faces/flow/SwitchCase.java | 32 -
api/src/main/java/javax/faces/flow/SwitchNode.java | 34 -
api/src/main/java/javax/faces/flow/ViewNode.java | 28 -
.../java/javax/faces/flow/builder/FlowBuilder.java | 61 -
.../faces/flow/builder/FlowBuilderParameter.java | 39 -
.../javax/faces/flow/builder/FlowCallBuilder.java | 38 -
.../javax/faces/flow/builder/FlowDefinition.java | 37 -
.../faces/flow/builder/MethodCallBuilder.java | 45 -
.../faces/flow/builder/NavigationCaseBuilder.java | 52 -
.../java/javax/faces/flow/builder/NodeBuilder.java | 28 -
.../javax/faces/flow/builder/ReturnBuilder.java | 33 -
.../javax/faces/flow/builder/SwitchBuilder.java | 34 -
.../faces/flow/builder/SwitchCaseBuilder.java | 34 -
.../java/javax/faces/flow/builder/ViewBuilder.java | 28 -
.../java/javax/faces/lifecycle/ClientWindow.java | 58 -
.../javax/faces/lifecycle/ClientWindowFactory.java | 48 -
.../javax/faces/lifecycle/ClientWindowWrapper.java | 79 -
.../main/java/javax/faces/lifecycle/Lifecycle.java | 50 -
.../javax/faces/lifecycle/LifecycleFactory.java | 66 -
.../javax/faces/lifecycle/LifecycleWrapper.java | 75 -
.../java/javax/faces/model/ArrayDataModel.java | 125 -
.../javax/faces/model/CollectionDataModel.java | 128 -
api/src/main/java/javax/faces/model/DataModel.java | 214 --
.../java/javax/faces/model/DataModelEvent.java | 56 -
.../java/javax/faces/model/DataModelListener.java | 27 -
.../java/javax/faces/model/FacesDataModel.java | 39 -
.../java/javax/faces/model/IterableDataModel.java | 181 --
.../main/java/javax/faces/model/ListDataModel.java | 128 -
.../java/javax/faces/model/ResultDataModel.java | 140 -
.../java/javax/faces/model/ResultSetDataModel.java | 772 ------
.../java/javax/faces/model/ScalarDataModel.java | 117 -
.../main/java/javax/faces/model/SelectItem.java | 167 --
.../java/javax/faces/model/SelectItemGroup.java | 70 -
api/src/main/java/javax/faces/push/Push.java | 37 -
.../main/java/javax/faces/push/PushContext.java | 45 -
.../javax/faces/render/ClientBehaviorRenderer.java | 54 -
.../javax/faces/render/FacesBehaviorRenderer.java | 47 -
.../java/javax/faces/render/FacesRenderer.java | 51 -
.../main/java/javax/faces/render/RenderKit.java | 132 -
.../java/javax/faces/render/RenderKitFactory.java | 67 -
.../java/javax/faces/render/RenderKitWrapper.java | 126 -
api/src/main/java/javax/faces/render/Renderer.java | 158 --
.../java/javax/faces/render/RendererWrapper.java | 85 -
.../javax/faces/render/ResponseStateManager.java | 151 --
.../java/javax/faces/validator/BeanValidator.java | 685 -----
.../faces/validator/DoubleRangeValidator.java | 294 ---
.../java/javax/faces/validator/FacesValidator.java | 52 -
.../javax/faces/validator/LengthValidator.java | 263 --
.../javax/faces/validator/LongRangeValidator.java | 290 ---
.../faces/validator/MethodExpressionValidator.java | 131 -
.../java/javax/faces/validator/RegexValidator.java | 263 --
.../javax/faces/validator/RequiredValidator.java | 103 -
.../main/java/javax/faces/validator/Validator.java | 36 -
.../javax/faces/validator/ValidatorException.java | 120 -
.../faces/validator/_ExternalSpecifications.java | 84 -
.../faces/validator/_LabeledFacesMessage.java | 72 -
.../java/javax/faces/validator/_MessageUtils.java | 234 --
.../validator/_ParametrizableFacesMessage.java | 156 --
.../javax/faces/validator/_ValidationUtils.java | 35 -
.../view/ActionSource2AttachedObjectHandler.java | 31 -
.../view/ActionSource2AttachedObjectTarget.java | 30 -
.../javax/faces/view/AttachedObjectHandler.java | 53 -
.../javax/faces/view/AttachedObjectTarget.java | 39 -
.../view/BehaviorHolderAttachedObjectHandler.java | 27 -
.../view/BehaviorHolderAttachedObjectTarget.java | 27 -
.../EditableValueHolderAttachedObjectHandler.java | 33 -
.../EditableValueHolderAttachedObjectTarget.java | 30 -
api/src/main/java/javax/faces/view/Location.java | 58 -
.../javax/faces/view/StateManagementStrategy.java | 32 -
.../view/ValueHolderAttachedObjectHandler.java | 31 -
.../view/ValueHolderAttachedObjectTarget.java | 30 -
.../javax/faces/view/ViewDeclarationLanguage.java | 177 --
.../faces/view/ViewDeclarationLanguageFactory.java | 65 -
.../faces/view/ViewDeclarationLanguageWrapper.java | 140 -
.../main/java/javax/faces/view/ViewMetadata.java | 204 --
api/src/main/java/javax/faces/view/ViewScoped.java | 42 -
.../faces/view/facelets/AttributeHandler.java | 27 -
.../javax/faces/view/facelets/BehaviorConfig.java | 27 -
.../javax/faces/view/facelets/BehaviorHandler.java | 81 -
.../javax/faces/view/facelets/ComponentConfig.java | 29 -
.../faces/view/facelets/ComponentHandler.java | 129 -
.../view/facelets/CompositeFaceletHandler.java | 54 -
.../javax/faces/view/facelets/ConverterConfig.java | 27 -
.../faces/view/facelets/ConverterHandler.java | 64 -
.../view/facelets/DelegatingMetaTagHandler.java | 105 -
.../java/javax/faces/view/facelets/Facelet.java | 46 -
.../javax/faces/view/facelets/FaceletCache.java | 82 -
.../faces/view/facelets/FaceletCacheFactory.java | 47 -
.../javax/faces/view/facelets/FaceletContext.java | 119 -
.../faces/view/facelets/FaceletException.java | 47 -
.../javax/faces/view/facelets/FaceletHandler.java | 43 -
.../facelets/FaceletsAttachedObjectHandler.java | 72 -
.../view/facelets/FaceletsResourceResolver.java | 33 -
.../javax/faces/view/facelets/FacetHandler.java | 27 -
.../java/javax/faces/view/facelets/MetaRule.java | 33 -
.../javax/faces/view/facelets/MetaRuleset.java | 61 -
.../javax/faces/view/facelets/MetaTagHandler.java | 66 -
.../java/javax/faces/view/facelets/Metadata.java | 31 -
.../javax/faces/view/facelets/MetadataTarget.java | 63 -
.../faces/view/facelets/ResourceResolver.java | 36 -
.../main/java/javax/faces/view/facelets/Tag.java | 111 -
.../javax/faces/view/facelets/TagAttribute.java | 181 --
.../faces/view/facelets/TagAttributeException.java | 89 -
.../javax/faces/view/facelets/TagAttributes.java | 94 -
.../java/javax/faces/view/facelets/TagConfig.java | 31 -
.../javax/faces/view/facelets/TagDecorator.java | 29 -
.../javax/faces/view/facelets/TagException.java | 64 -
.../java/javax/faces/view/facelets/TagHandler.java | 79 -
.../faces/view/facelets/TagHandlerDelegate.java | 33 -
.../view/facelets/TagHandlerDelegateFactory.java | 56 -
.../javax/faces/view/facelets/TextHandler.java | 29 -
.../javax/faces/view/facelets/ValidatorConfig.java | 27 -
.../faces/view/facelets/ValidatorHandler.java | 65 -
.../main/java/javax/faces/webapp/AttributeTag.java | 131 -
.../java/javax/faces/webapp/ConverterELTag.java | 66 -
.../main/java/javax/faces/webapp/ConverterTag.java | 130 -
.../main/java/javax/faces/webapp/FacesServlet.java | 256 --
api/src/main/java/javax/faces/webapp/FacetTag.java | 67 -
.../webapp/PreJsf2ExceptionHandlerFactory.java | 292 ---
.../javax/faces/webapp/UIComponentBodyTag.java | 29 -
.../faces/webapp/UIComponentClassicTagBase.java | 1366 ----------
.../java/javax/faces/webapp/UIComponentELTag.java | 134 -
.../java/javax/faces/webapp/UIComponentTag.java | 362 ---
.../javax/faces/webapp/UIComponentTagBase.java | 108 -
.../java/javax/faces/webapp/ValidatorELTag.java | 63 -
.../main/java/javax/faces/webapp/ValidatorTag.java | 130 -
.../javax/faces/webapp/_PageContextOutWriter.java | 79 -
.../META-INF/resources/myfaces/_impl/_util/_Dom.js | 2 +-
.../META-INF/resources/myfaces/_impl/core/Impl.js | 26 +-
.../myfaces/_impl/xhrCore/_AjaxRequest.js | 8 +-
.../myfaces/_impl/xhrCore/_AjaxResponse.js | 16 +-
.../myfaces/_impl/xhrCore/_ExtAjaxRequest.js | 2 +-
.../myfaces/_impl/xhrCore/_IFrameRequest.js | 6 +-
.../META-INF/resources/myfaces/api/jsf.js | 4 +-
.../main/resources/META-INF/componentClass20.vm | 18 +-
.../resources/jakarta/faces/Messages.properties | 131 +
.../resources/jakarta/faces/Messages_ar.properties | 145 ++
.../resources/jakarta/faces/Messages_ca.properties | 134 +
.../resources/jakarta/faces/Messages_cs.properties | 129 +
.../resources/jakarta/faces/Messages_de.properties | 130 +
.../resources/jakarta/faces/Messages_en.properties | 131 +
.../resources/jakarta/faces/Messages_es.properties | 138 +
.../resources/jakarta/faces/Messages_fr.properties | 134 +
.../resources/jakarta/faces/Messages_it.properties | 137 +
.../resources/jakarta/faces/Messages_ja.properties | 128 +
.../resources/jakarta/faces/Messages_mt.properties | 125 +
.../resources/jakarta/faces/Messages_nl.properties | 118 +
.../resources/jakarta/faces/Messages_pl.properties | 116 +
.../jakarta/faces/Messages_pt_BR.properties | 133 +
.../resources/jakarta/faces/Messages_ru.properties | 116 +
.../resources/jakarta/faces/Messages_sk.properties | 129 +
.../jakarta/faces/Messages_zh_CN.properties | 131 +
.../jakarta/faces/Messages_zh_HK.properties | 131 +
.../jakarta/faces/Messages_zh_TW.properties | 131 +
.../main/resources/javax/faces/Messages.properties | 131 -
.../resources/javax/faces/Messages_ar.properties | 145 --
.../resources/javax/faces/Messages_ca.properties | 134 -
.../resources/javax/faces/Messages_cs.properties | 129 -
.../resources/javax/faces/Messages_de.properties | 130 -
.../resources/javax/faces/Messages_en.properties | 131 -
.../resources/javax/faces/Messages_es.properties | 138 -
.../resources/javax/faces/Messages_fr.properties | 134 -
.../resources/javax/faces/Messages_it.properties | 137 -
.../resources/javax/faces/Messages_ja.properties | 128 -
.../resources/javax/faces/Messages_mt.properties | 125 -
.../resources/javax/faces/Messages_nl.properties | 118 -
.../resources/javax/faces/Messages_pl.properties | 116 -
.../javax/faces/Messages_pt_BR.properties | 133 -
.../resources/javax/faces/Messages_ru.properties | 116 -
.../resources/javax/faces/Messages_sk.properties | 129 -
.../javax/faces/Messages_zh_CN.properties | 131 -
.../javax/faces/Messages_zh_HK.properties | 131 -
.../javax/faces/Messages_zh_TW.properties | 131 -
.../test/java/javax/faces/FacesExceptionTest.java | 99 -
.../test/java/javax/faces/FactoryFinderTest.java | 287 ---
.../javax/faces/application/ApplicationTest.java | 141 --
.../javax/faces/application/FacesMessageTest.java | 244 --
.../javax/faces/application/MockApplication.java | 236 --
.../javax/faces/application/StateManagerTest.java | 162 --
.../javax/faces/application/ViewHandlerTest.java | 233 --
.../faces/component/AbstractComponentTest.java | 50 -
.../component/AbstractUIComponentBaseTest.java | 82 -
.../component/AbstractUIComponentPropertyTest.java | 130 -
.../faces/component/InvokeOnComponentTest.java | 283 ---
.../faces/component/UIComponentAttributesTest.java | 67 -
.../UIComponentBaseFacesListenerTest.java | 117 -
.../component/UIComponentBaseGetChildrenTest.java | 191 --
.../component/UIComponentBaseGetClientIdTest.java | 178 --
...UIComponentBaseProcessSaveRestoreStateTest.java | 183 --
.../javax/faces/component/UIComponentBaseTest.java | 427 ----
.../component/UIComponentBaseValueBindingTest.java | 121 -
.../faces/component/UIComponentEncodeAllTest.java | 127 -
.../UIComponentEventListenerWrapperTest.java | 662 -----
.../component/UIComponentFindComponentTest.java | 202 --
.../UIComponentInvokeOnComponentTest.java | 155 --
.../javax/faces/component/UIComponentMock.java | 28 -
.../javax/faces/component/UIComponentTest.java | 90 -
.../javax/faces/component/UIComponentTestBase.java | 46 -
.../component/UIComponentValueExpressionTest.java | 144 --
.../javax/faces/component/UIDataRowStateTest.java | 278 --
.../java/javax/faces/component/UIDataTest.java | 1148 ---------
.../java/javax/faces/component/UIGraphicTest.java | 67 -
.../java/javax/faces/component/UIInputTest.java | 496 ----
.../javax/faces/component/UIOutputPSSTest.java | 562 ----
.../javax/faces/component/UISelectItemsTest.java | 92 -
.../javax/faces/component/UISelectManyTest.java | 181 --
.../javax/faces/component/UISelectOneTest.java | 185 --
.../javax/faces/component/UIViewParameterTest.java | 86 -
.../java/javax/faces/component/UIViewRootTest.java | 637 -----
.../component/_AttachedListStateWrapperTest.java | 86 -
.../faces/component/_AttachedStateWrapperTest.java | 98 -
.../javax/faces/component/_ComponentUtilsTest.java | 49 -
.../faces/component/_Delta2StateHelperTest.java | 605 -----
.../component/_DeltaFacesListenerListTest.java | 520 ----
.../java/javax/faces/component/_DeltaListTest.java | 774 ------
.../faces/component/_DeltaStateHelperTest.java | 304 ---
.../_MethodBindingToMethodExpressionTest.java | 209 --
.../faces/component/_SelectItemsUtilTest.java | 164 --
.../faces/component/_SharedRendererUtilsTest.java | 346 ---
.../_ValueBindingToValueExpressionTest.java | 274 --
.../_ValueExpressionToValueBindingTest.java | 297 ---
.../faces/component/html/HtmlOutputLinkTest.java | 37 -
.../java/javax/faces/context/MockFacesContext.java | 39 -
.../javax/faces/convert/DateTimeConverterTest.java | 111 -
.../javax/faces/convert/DoubleConverterTest.java | 157 --
.../javax/faces/convert/EnumConverterTest.java | 184 --
.../java/javax/faces/convert/MessageUtilsTest.java | 73 -
.../javax/faces/convert/NumberConverterTest.java | 206 --
.../event/MethodExpressionActionListenerTest.java | 160 --
.../MethodExpressionValueChangeListenerTest.java | 160 --
.../javax/faces/validator/_MessageUtilsTest.java | 74 -
.../myfaces/mock/MockRenderedValueExpression.java | 69 -
.../myfaces/mock/api/Mock2ApplicationFactory.java | 54 -
.../myfaces/mock/api/MockApplicationFactory.java | 51 -
.../org/apache/myfaces/ajax/AjaxTests.js | 14 +-
bundle/pom.xml | 2 +-
impl-test/pom.xml | 5 +-
.../core/AbstractMyFacesCDIRequestTestCase.java | 4 +-
.../test/core/AbstractMyFacesFaceletsTestCase.java | 8 +-
.../test/core/AbstractMyFacesRequestTestCase.java | 6 +-
.../mc/test/core/AbstractMyFacesTestCase.java | 50 +-
.../test/core/annotation/DeclareFacesConfig.java | 2 +-
.../mock/MockDefaultViewDeclarationLanguage.java | 28 +-
...MockDefaultViewDeclarationLanguageStrategy.java | 2 +-
.../mc/test/core/mock/MockMyFacesClient.java | 36 +-
.../MockMyFacesFaceletViewDeclarationLanguage.java | 10 +-
...acesFaceletViewDeclarationLanguageStrategy.java | 8 +-
.../MockMyFacesViewDeclarationLanguageFactory.java | 6 +-
.../mc/test/core/mock/ServletMockContainer.java | 2 +-
.../runner/AbstractJsfRequestTestContainer.java | 8 +-
.../test/core/runner/AbstractJsfTestContainer.java | 53 +-
.../mc/test/core/runner/MyFacesTestRunner.java | 2 +-
impl/pom.xml | 17 +-
.../conf/META-INF/standard-faces-config-base.xml | 26 +-
.../myfaces/application/ActionListenerImpl.java | 28 +-
.../application/ApplicationFactoryImpl.java | 10 +-
.../myfaces/application/ApplicationImpl.java | 127 +-
...ackwardsCompatibleNavigationHandlerWrapper.java | 8 +-
.../DefaultNavigationHandlerSupport.java | 2 +-
.../application/DefaultResourceHandlerSupport.java | 8 +-
.../myfaces/application/FlowNavigationCase.java | 4 +-
.../myfaces/application/NavigationHandlerImpl.java | 58 +-
.../application/NavigationHandlerSupport.java | 2 +-
.../myfaces/application/ResourceHandlerImpl.java | 20 +-
.../org/apache/myfaces/application/StateCache.java | 4 +-
.../myfaces/application/StateCacheFactory.java | 4 +-
.../myfaces/application/StateManagerImpl.java | 24 +-
.../myfaces/application/TreeStructureManager.java | 6 +-
.../myfaces/application/ViewHandlerImpl.java | 32 +-
.../myfaces/application/ViewResourceIterator.java | 4 +-
.../myfaces/application/_ApplicationUtils.java | 21 +-
.../application/_FlowNavigationStructure.java | 2 +-
.../viewstate/ClientSideStateCacheImpl.java | 4 +-
.../viewstate/CsrfSessionTokenFactory.java | 2 +-
.../myfaces/application/viewstate/KeyFactory.java | 2 +-
.../viewstate/RandomCsrfSessionTokenFactory.java | 4 +-
.../application/viewstate/RandomKeyFactory.java | 4 +-
.../viewstate/RandomSessionViewStorageFactory.java | 2 +-
.../SecureRandomCsrfSessionTokenFactory.java | 2 +-
.../viewstate/SecureRandomKeyFactory.java | 4 +-
.../viewstate/SerializedViewCollection.java | 2 +-
.../viewstate/ServerSideStateCacheImpl.java | 12 +-
.../viewstate/SessionViewStorageFactory.java | 2 +-
.../viewstate/StateCacheFactoryImpl.java | 2 +-
.../application/viewstate/StateCacheUtils.java | 4 +-
.../token/ClientSideStateTokenProcessor.java | 2 +-
.../token/ServiceSideStateTokenProcessor.java | 4 +-
.../viewstate/token/StateTokenProcessor.java | 2 +-
.../myfaces/cdi/JsfArtifactFlowMapProducer.java | 6 +-
.../apache/myfaces/cdi/JsfArtifactProducer.java | 32 +-
.../myfaces/cdi/JsfArtifactProducerExtension.java | 2 +-
.../behavior/FacesBehaviorAnnotationLiteral.java | 2 +-
.../cdi/behavior/FacesBehaviorCDIWrapper.java | 10 +-
.../cdi/behavior/FacesBehaviorExtension.java | 2 +-
.../cdi/behavior/FacesBehaviorProducer.java | 4 +-
.../behavior/FacesClientBehaviorCDIWrapper.java | 16 +-
.../myfaces/cdi/config/FacesConfigBeanHolder.java | 2 +-
.../myfaces/cdi/config/FacesConfigExtension.java | 2 +-
.../converter/FacesConverterAnnotationLiteral.java | 2 +-
.../cdi/converter/FacesConverterCDIWrapper.java | 12 +-
.../cdi/converter/FacesConverterExtension.java | 2 +-
.../cdi/converter/FacesConverterProducer.java | 4 +-
.../cdi/impl/CDIAnnotationInjectionProvider.java | 2 +-
.../cdi/impl/CDIManagedBeanHandlerImpl.java | 4 +-
.../managedproperty/ManagedPropertyExtension.java | 2 +-
.../managedproperty/ManagedPropertyProducer.java | 6 +-
.../apache/myfaces/cdi/model/DataModelBuilder.java | 4 +-
.../myfaces/cdi/model/DataModelBuilderProxy.java | 4 +-
.../cdi/model/DynamicDataModelProducer.java | 2 +-
.../cdi/model/FacesDataModelAnnotationLiteral.java | 2 +-
.../cdi/model/FacesDataModelClassBeanHolder.java | 6 +-
.../myfaces/cdi/model/FacesDataModelExtension.java | 4 +-
.../myfaces/cdi/scope/FacesScopeBeanHolder.java | 2 +-
.../myfaces/cdi/scope/FacesScopeProvider.java | 2 +-
.../myfaces/cdi/scope/FacesScopedContextImpl.java | 2 +-
.../cdi/scope/ViewTransientScopeBeanHolder.java | 2 +-
.../cdi/scope/ViewTransientScopedContextImpl.java | 2 +-
.../java/org/apache/myfaces/cdi/util/CDIUtils.java | 4 +-
.../validator/FacesValidatorAnnotationLiteral.java | 2 +-
.../cdi/validator/FacesValidatorCDIWrapper.java | 12 +-
.../cdi/validator/FacesValidatorExtension.java | 2 +-
.../cdi/validator/FacesValidatorProducer.java | 4 +-
.../myfaces/cdi/view/ViewScopeBeanHolder.java | 6 +-
.../apache/myfaces/cdi/view/ViewScopeCDIMap.java | 2 +-
.../cdi/view/ViewScopeContextExtension.java | 2 +-
.../myfaces/cdi/view/ViewScopeContextImpl.java | 6 +-
.../cdi/view/ViewScopeContextualStorage.java | 2 +-
.../component/ComponentResourceContainer.java | 8 +-
.../component/search/AllSearchKeywordResolver.java | 10 +-
.../search/ChildSearchKeywordResolver.java | 12 +-
...positeComponentParentSearchKeywordResolver.java | 8 +-
.../search/CompositeSearchKeywordResolver.java | 8 +-
.../search/FormSearchKeywordResolver.java | 12 +-
.../component/search/IdSearchKeywordResolver.java | 22 +-
.../NamingContainerSearchKeywordResolver.java | 10 +-
.../search/NextSearchKeywordResolver.java | 10 +-
.../search/NoneSearchKeywordResolver.java | 10 +-
.../search/ParentSearchKeywordResolver.java | 8 +-
.../search/PreviousSearchKeywordResolver.java | 10 +-
.../search/RootSearchKeywordResolver.java | 8 +-
.../component/search/SearchComponentUtils.java | 2 +-
.../search/SearchExpressionContextFactoryImpl.java | 12 +-
.../search/SearchExpressionContextImpl.java | 10 +-
.../search/SearchExpressionHandlerImpl.java | 22 +-
.../search/ThisSearchKeywordResolver.java | 8 +-
.../validate/ValidateWholeBeanComponent.java | 12 +-
.../component/validate/WholeBeanValidator.java | 28 +-
.../validate/_ValueReferenceResolver.java | 2 +-
.../myfaces/component/visit/FullVisitContext.java | 14 +-
.../component/visit/PartialVisitContext.java | 14 +-
.../component/visit/VisitContextFactoryImpl.java | 8 +-
.../config/ConfigFilesXmlValidationUtils.java | 2 +-
.../config/DefaultFacesConfigResourceProvider.java | 2 +-
.../config/DefaultFacesConfigurationMerger.java | 6 +-
.../config/DefaultFacesConfigurationProvider.java | 12 +-
.../myfaces/config/FacesConfigValidator.java | 2 +-
.../apache/myfaces/config/FacesConfigurator.java | 76 +-
.../org/apache/myfaces/config/LogMetaInfUtils.java | 2 +-
.../apache/myfaces/config/ManagedBeanBuilder.java | 10 +-
.../myfaces/config/ManagedBeanDestroyer.java | 12 +-
.../apache/myfaces/config/NamedEventManager.java | 14 +-
.../org/apache/myfaces/config/RuntimeConfig.java | 8 +-
.../config/annotation/AnnotationConfigurator.java | 72 +-
.../annotation/CdiAnnotationProviderExtension.java | 16 +-
.../annotation/DefaultAnnotationProvider.java | 22 +-
.../DefaultLifecycleProviderFactory.java | 4 +-
.../annotation/LifecycleProviderFactory.java | 6 +-
.../Tomcat7AnnotationLifecycleProvider.java | 6 +-
.../myfaces/config/element/FacesConfigData.java | 3 +-
.../apache/myfaces/config/element/ManagedBean.java | 2 +-
.../myfaces/config/element/ManagedProperty.java | 4 +-
.../config/impl/FacesConfigEntityResolver.java | 2 +-
.../digester/DigesterFacesConfigDispenserImpl.java | 4 +-
.../DigesterFacesConfigUnmarshallerImpl.java | 2 +-
.../impl/digester/elements/ManagedBeanImpl.java | 2 +-
.../digester/elements/ManagedPropertyImpl.java | 4 +-
.../org/apache/myfaces/config/util/GAEUtils.java | 2 +-
.../context/ExceptionHandlerFactoryImpl.java | 4 +-
.../context/ExternalContextFactoryImpl.java | 10 +-
.../myfaces/context/FacesContextFactoryImpl.java | 26 +-
.../myfaces/context/FacesContextWrapper.java | 24 +-
.../MyFacesExceptionHandlerWrapperImpl.java | 22 +-
.../myfaces/context/PartialResponseWriterImpl.java | 6 +-
.../context/PartialViewContextFactoryImpl.java | 10 +-
.../apache/myfaces/context/RequestViewContext.java | 18 +-
.../myfaces/context/RequestViewMetadata.java | 4 +-
.../myfaces/context/servlet/FacesContextImpl.java | 26 +-
.../context/servlet/FacesContextImplBase.java | 24 +-
.../context/servlet/PartialViewContextImpl.java | 54 +-
.../servlet/ServletExternalContextImpl.java | 18 +-
.../servlet/ServletExternalContextImplBase.java | 4 +-
.../context/servlet/ServletFlashFactoryImpl.java | 6 +-
.../context/servlet/StartupFacesContextImpl.java | 14 +-
.../servlet/StartupServletExternalContextImpl.java | 2 +-
.../myfaces/ee/MyFacesContainerInitializer.java | 60 +-
.../apache/myfaces/el/DefaultPropertyResolver.java | 8 +-
.../org/apache/myfaces/el/FlashELResolver.java | 6 +-
.../apache/myfaces/el/NullPropertyResolver.java | 8 +-
.../apache/myfaces/el/NullVariableResolver.java | 6 +-
.../apache/myfaces/el/PropertyResolverImpl.java | 8 +-
.../myfaces/el/ResolverForJSPInitializer.java | 12 +-
.../apache/myfaces/el/VariableResolverImpl.java | 8 +-
...ableResolverToApplicationELResolverAdapter.java | 6 +-
.../el/convert/ELResolverToPropertyResolver.java | 24 +-
.../el/convert/ELResolverToVariableResolver.java | 6 +-
.../convert/MethodExpressionToMethodBinding.java | 18 +-
.../el/convert/PropertyResolverToELResolver.java | 18 +-
.../el/convert/ValueBindingToValueExpression.java | 12 +-
.../el/convert/ValueExpressionToValueBinding.java | 21 +-
.../el/convert/VariableResolverToELResolver.java | 8 +-
.../unified/CustomFirstELResolverComparator.java | 4 +-
.../myfaces/el/unified/ELResolverBuilder.java | 4 +-
.../apache/myfaces/el/unified/FacesELContext.java | 2 +-
.../myfaces/el/unified/ResolverBuilderBase.java | 10 +-
.../el/unified/ResolverBuilderForFaces.java | 2 +-
.../myfaces/el/unified/ResolverBuilderForJSP.java | 2 +-
.../resolver/CompositeComponentELResolver.java | 6 +-
.../unified/resolver/FacesCompositeELResolver.java | 4 +-
.../myfaces/el/unified/resolver/GuiceResolver.java | 6 +-
.../resolver/ImportConstantsELResolver.java | 8 +-
.../el/unified/resolver/ManagedBeanResolver.java | 10 +-
.../unified/resolver/ResourceBundleResolver.java | 4 +-
.../el/unified/resolver/ResourceResolver.java | 10 +-
.../unified/resolver/ScopedAttributeResolver.java | 6 +-
.../implicitobject/ComponentImplicitObject.java | 2 +-
.../CompositeComponentImplicitObject.java | 4 +-
.../implicitobject/FacesContextImplicitObject.java | 2 +-
.../implicitobject/FlowScopeImplicitObject.java | 2 +-
.../resolver/implicitobject/ImplicitObject.java | 4 +-
.../implicitobject/ViewImplicitObject.java | 2 +-
.../PostClientWindowAndViewInitializedEvent.java | 2 +-
.../myfaces/event/SetPropertyActionListener.java | 10 +-
.../org/apache/myfaces/flow/FlowCallNodeImpl.java | 6 +-
.../myfaces/flow/FlowHandlerFactoryImpl.java | 6 +-
.../org/apache/myfaces/flow/FlowHandlerImpl.java | 30 +-
.../java/org/apache/myfaces/flow/FlowImpl.java | 22 +-
.../java/org/apache/myfaces/flow/FlowNodeImpl.java | 2 +-
.../apache/myfaces/flow/MethodCallNodeImpl.java | 4 +-
.../apache/myfaces/flow/NavigationCaseImpl.java | 4 +-
.../org/apache/myfaces/flow/ParameterImpl.java | 2 +-
.../org/apache/myfaces/flow/ReturnNodeImpl.java | 4 +-
.../org/apache/myfaces/flow/SwitchCaseImpl.java | 4 +-
.../org/apache/myfaces/flow/SwitchNodeImpl.java | 6 +-
.../java/org/apache/myfaces/flow/ViewNodeImpl.java | 2 +-
.../myfaces/flow/builder/FlowBuilderImpl.java | 18 +-
.../myfaces/flow/builder/FlowCallBuilderImpl.java | 2 +-
.../flow/builder/MethodCallBuilderImpl.java | 4 +-
.../flow/builder/NavigationCaseBuilderImpl.java | 2 +-
.../myfaces/flow/builder/ReturnBuilderImpl.java | 2 +-
.../myfaces/flow/builder/SwitchBuilderImpl.java | 4 +-
.../flow/builder/SwitchCaseBuilderImpl.java | 2 +-
.../myfaces/flow/builder/ViewBuilderImpl.java | 2 +-
.../flow/cdi/DefaultCDIFacesFlowProvider.java | 4 +-
.../myfaces/flow/cdi/FlowBuilderCDIExtension.java | 4 +-
.../myfaces/flow/cdi/FlowBuilderFactoryBean.java | 8 +-
.../myfaces/flow/cdi/FlowScopeBeanHolder.java | 12 +-
.../myfaces/flow/cdi/FlowScopeCDIExtension.java | 2 +-
.../myfaces/flow/cdi/FlowScopedContextImpl.java | 8 +-
.../flow/impl/AnnotatedFlowConfigurator.java | 4 +-
.../flow/impl/DefaultFacesFlowProvider.java | 6 +-
.../org/apache/myfaces/flow/impl/FlowScopeMap.java | 2 +-
.../org/apache/myfaces/flow/util/FlowUtils.java | 4 +-
.../lifecycle/ApplyRequestValuesExecutor.java | 4 +-
.../myfaces/lifecycle/CODIClientSideWindow.java | 12 +-
.../org/apache/myfaces/lifecycle/ClientConfig.java | 6 +-
.../myfaces/lifecycle/ClientWindowFactoryImpl.java | 6 +-
.../lifecycle/DefaultRestoreViewSupport.java | 32 +-
.../lifecycle/InvokeApplicationExecutor.java | 4 +-
.../myfaces/lifecycle/LifecycleFactoryImpl.java | 6 +-
.../apache/myfaces/lifecycle/LifecycleImpl.java | 24 +-
.../apache/myfaces/lifecycle/PhaseExecutor.java | 4 +-
.../myfaces/lifecycle/PhaseListenerManager.java | 14 +-
.../lifecycle/ProcessValidationsExecutor.java | 4 +-
.../myfaces/lifecycle/RenderResponseExecutor.java | 22 +-
.../myfaces/lifecycle/RestoreViewExecutor.java | 46 +-
.../myfaces/lifecycle/RestoreViewSupport.java | 10 +-
.../lifecycle/UpdateModelValuesExecutor.java | 4 +-
.../apache/myfaces/lifecycle/UrlClientWindow.java | 6 +-
.../myfaces/lifecycle/ViewNotFoundException.java | 2 +-
.../myfaces/push/AbstractWebsocketComponent.java | 6 +-
.../java/org/apache/myfaces/push/EndpointImpl.java | 8 +-
.../push/HtmlBufferResponseWriterWrapper.java | 2 +-
.../myfaces/push/WebsocketComponentRenderer.java | 28 +-
.../apache/myfaces/push/WebsocketConfigurator.java | 2 +-
.../apache/myfaces/push/WebsocketFacesInit.java | 2 +-
.../apache/myfaces/push/WebsocketInitRenderer.java | 10 +-
.../org/apache/myfaces/push/_WebsocketInit.java | 4 +-
.../myfaces/push/cdi/CsrfSessionTokenFactory.java | 2 +-
.../myfaces/push/cdi/PushContextCDIExtension.java | 4 +-
.../myfaces/push/cdi/PushContextFactoryBean.java | 4 +-
.../apache/myfaces/push/cdi/PushContextImpl.java | 6 +-
.../push/cdi/RandomCsrfSessionTokenFactory.java | 4 +-
.../cdi/SecureRandomCsrfSessionTokenFactory.java | 2 +-
.../cdi/WebsocketApplicationSessionHolder.java | 4 +-
.../push/cdi/WebsocketChannelTokenBuilderBean.java | 2 +-
.../apache/myfaces/push/cdi/WebsocketViewBean.java | 2 +-
.../apache/myfaces/renderkit/ErrorPageWriter.java | 42 +-
.../renderkit/MyfacesResponseStateManager.java | 4 +-
.../myfaces/renderkit/RenderKitFactoryImpl.java | 8 +-
.../html/EarlyFlushHtmlResponseWriterImpl.java | 8 +-
.../renderkit/html/HtmlAjaxBehaviorRenderer.java | 32 +-
.../myfaces/renderkit/html/HtmlBodyRenderer.java | 4 +-
.../myfaces/renderkit/html/HtmlButtonRenderer.java | 6 +-
.../renderkit/html/HtmlCheckboxRenderer.java | 10 +-
.../renderkit/html/HtmlCommandScriptRenderer.java | 30 +-
.../html/HtmlCompositeComponentRenderer.java | 6 +-
.../renderkit/html/HtmlCompositeFacetRenderer.java | 6 +-
.../renderkit/html/HtmlDoctypeRenderer.java | 10 +-
.../myfaces/renderkit/html/HtmlFormRenderer.java | 8 +-
.../myfaces/renderkit/html/HtmlFormatRenderer.java | 16 +-
.../myfaces/renderkit/html/HtmlGridRenderer.java | 6 +-
.../myfaces/renderkit/html/HtmlGroupRenderer.java | 6 +-
.../myfaces/renderkit/html/HtmlHeadRenderer.java | 14 +-
.../myfaces/renderkit/html/HtmlHiddenRenderer.java | 14 +-
.../myfaces/renderkit/html/HtmlImageRenderer.java | 6 +-
.../renderkit/html/HtmlInputFileRenderer.java | 6 +-
.../myfaces/renderkit/html/HtmlLabelRenderer.java | 20 +-
.../myfaces/renderkit/html/HtmlLinkRenderer.java | 14 +-
.../renderkit/html/HtmlListboxRenderer.java | 10 +-
.../myfaces/renderkit/html/HtmlMenuRenderer.java | 10 +-
.../renderkit/html/HtmlMessageRenderer.java | 12 +-
.../renderkit/html/HtmlMessagesRenderer.java | 12 +-
.../html/HtmlOutcomeTargetButtonRenderer.java | 6 +-
.../myfaces/renderkit/html/HtmlRadioRenderer.java | 6 +-
.../myfaces/renderkit/html/HtmlRenderKitImpl.java | 18 +-
.../renderkit/html/HtmlResponseStateManager.java | 24 +-
.../myfaces/renderkit/html/HtmlScriptRenderer.java | 30 +-
.../myfaces/renderkit/html/HtmlSecretRenderer.java | 6 +-
.../renderkit/html/HtmlStylesheetRenderer.java | 26 +-
.../myfaces/renderkit/html/HtmlTableRenderer.java | 6 +-
.../myfaces/renderkit/html/HtmlTextRenderer.java | 10 +-
.../renderkit/html/HtmlTextareaRenderer.java | 6 +-
.../ClassLoaderContractResourceLoader.java | 4 +-
.../DefaultResourceLibraryContractsProvider.java | 10 +-
.../ExternalContextContractResourceLoader.java | 4 +-
.../InternalClassLoaderResourceLoader.java | 8 +-
.../RootExternalContextResourceLoader.java | 6 +-
.../TempDirFileCacheContractResourceLoader.java | 6 +-
.../resource/TempDirFileCacheResourceLoader.java | 6 +-
.../myfaces/shared_impl/webapp/webxml/WebXml.java | 4 +-
.../shared_impl/webapp/webxml/WebXmlParser.java | 4 +-
.../org/apache/myfaces/spi/AnnotationProvider.java | 20 +-
.../myfaces/spi/AnnotationProviderFactory.java | 4 +-
.../myfaces/spi/AnnotationProviderWrapper.java | 4 +-
.../myfaces/spi/FaceletConfigResourceProvider.java | 2 +-
.../spi/FaceletConfigResourceProviderFactory.java | 4 +-
.../myfaces/spi/FacesConfigResourceProvider.java | 2 +-
.../spi/FacesConfigResourceProviderFactory.java | 4 +-
.../myfaces/spi/FacesConfigurationMerger.java | 2 +-
.../spi/FacesConfigurationMergerFactory.java | 4 +-
.../myfaces/spi/FacesConfigurationProvider.java | 4 +-
.../spi/FacesConfigurationProviderFactory.java | 4 +-
.../spi/FacesConfigurationProviderWrapper.java | 4 +-
.../org/apache/myfaces/spi/FacesFlowProvider.java | 4 +-
.../myfaces/spi/FacesFlowProviderFactory.java | 4 +-
.../apache/myfaces/spi/FactoryFinderProvider.java | 10 +-
.../myfaces/spi/FactoryFinderProviderFactory.java | 12 +-
.../myfaces/spi/InjectionProviderFactory.java | 6 +-
.../spi/ResourceLibraryContractsProvider.java | 2 +-
.../ResourceLibraryContractsProviderFactory.java | 4 +-
.../apache/myfaces/spi/ServiceProviderFinder.java | 4 +-
.../myfaces/spi/ServiceProviderFinderFactory.java | 4 +-
.../org/apache/myfaces/spi/StateCacheProvider.java | 4 +-
.../myfaces/spi/StateCacheProviderFactory.java | 6 +-
.../myfaces/spi/StateCacheProviderWrapper.java | 4 +-
.../org/apache/myfaces/spi/ViewScopeProvider.java | 2 +-
.../myfaces/spi/ViewScopeProviderFactory.java | 6 +-
.../org/apache/myfaces/spi/WebConfigProvider.java | 4 +-
.../myfaces/spi/WebConfigProviderFactory.java | 4 +-
.../CDIAnnotationDelegateInjectionProvider.java | 2 +-
.../spi/impl/DefaultAnnotationProviderFactory.java | 4 +-
...efaultFaceletConfigResourceProviderFactory.java | 4 +-
.../DefaultFacesConfigResourceProviderFactory.java | 4 +-
.../DefaultFacesConfigurationMergerFactory.java | 4 +-
.../DefaultFacesConfigurationProviderFactory.java | 4 +-
.../spi/impl/DefaultFacesFlowProviderFactory.java | 2 +-
.../spi/impl/DefaultInjectionProviderFactory.java | 6 +-
...ultResourceLibraryContractsProviderFactory.java | 4 +-
.../spi/impl/DefaultServiceProviderFinder.java | 2 +-
.../spi/impl/DefaultStateCacheProviderFactory.java | 4 +-
.../spi/impl/DefaultViewScopeProviderFactory.java | 2 +-
.../myfaces/spi/impl/DefaultWebConfigProvider.java | 2 +-
.../spi/impl/DefaultWebConfigProviderFactory.java | 4 +-
.../java/org/apache/myfaces/spi/impl/SpiUtils.java | 2 +-
.../impl/Tomcat7AnnotationInjectionProvider.java | 4 +-
.../myfaces/taglib/core/ActionListenerTag.java | 8 +-
.../apache/myfaces/taglib/core/AttributeTag.java | 8 +-
.../myfaces/taglib/core/ConvertDateTimeTag.java | 8 +-
.../myfaces/taglib/core/ConvertNumberTag.java | 6 +-
.../myfaces/taglib/core/ConverterImplTag.java | 8 +-
.../apache/myfaces/taglib/core/ConverterTag.java | 6 +-
.../taglib/core/DelegateActionListener.java | 12 +-
.../myfaces/taglib/core/DelegateConverter.java | 10 +-
.../myfaces/taglib/core/DelegateValidator.java | 14 +-
.../taglib/core/DelegateValueChangeListener.java | 12 +-
.../myfaces/taglib/core/GenericListenerTag.java | 8 +-
.../taglib/core/GenericMinMaxValidatorTag.java | 4 +-
.../apache/myfaces/taglib/core/LoadBundleTag.java | 4 +-
.../org/apache/myfaces/taglib/core/ParamTag.java | 4 +-
.../myfaces/taglib/core/PhaseListenerTag.java | 20 +-
.../taglib/core/SetPropertyActionListenerTag.java | 8 +-
.../org/apache/myfaces/taglib/core/SubviewTag.java | 10 +-
.../taglib/core/ValidateDoubleRangeTag.java | 6 +-
.../myfaces/taglib/core/ValidateLengthTag.java | 6 +-
.../myfaces/taglib/core/ValidateLongRangeTag.java | 6 +-
.../myfaces/taglib/core/ValidateRegexTag.java | 12 +-
.../myfaces/taglib/core/ValidateRequiredTag.java | 12 +-
.../myfaces/taglib/core/ValidatorImplTag.java | 12 +-
.../apache/myfaces/taglib/core/ValidatorTag.java | 8 +-
.../taglib/core/ValueChangeListenerTag.java | 8 +-
.../apache/myfaces/taglib/core/VerbatimTag.java | 8 +-
.../org/apache/myfaces/taglib/core/ViewTag.java | 12 +-
.../org/apache/myfaces/util/ContainerUtils.java | 6 +-
.../java/org/apache/myfaces/util/DebugUtils.java | 30 +-
.../myfaces/util/ExternalSpecifications.java | 2 +-
.../org/apache/myfaces/util/NavigationUtils.java | 12 +-
.../view/ViewDeclarationLanguageFactoryImpl.java | 10 +-
.../view/ViewDeclarationLanguageStrategy.java | 2 +-
.../org/apache/myfaces/view/ViewMetadataBase.java | 4 +-
.../org/apache/myfaces/view/ViewScopeProxyMap.java | 6 +-
.../myfaces/view/facelets/AbstractFacelet.java | 14 +-
.../view/facelets/AbstractFaceletCache.java | 4 +-
.../view/facelets/AbstractFaceletContext.java | 10 +-
.../DefaultFaceletsStateManagementStrategy.java | 54 +-
...DynamicComponentRefreshTransientBuildEvent.java | 4 +-
.../view/facelets/FaceletCompositionContext.java | 18 +-
...DynamicComponentRefreshTransientBuildEvent.java | 4 +-
.../myfaces/view/facelets/FaceletFactory.java | 10 +-
.../facelets/FaceletViewDeclarationLanguage.java | 108 +-
.../FaceletViewDeclarationLanguageBase.java | 10 +-
.../FaceletViewDeclarationLanguageStrategy.java | 8 +-
.../PostBuildComponentTreeOnRestoreViewEvent.java | 8 +-
...amicComponentRefreshTransientBuildCallback.java | 8 +-
.../apache/myfaces/view/facelets/StateWriter.java | 2 +-
.../myfaces/view/facelets/TemplateClient.java | 8 +-
.../myfaces/view/facelets/TemplateContext.java | 10 +-
.../myfaces/view/facelets/ViewPoolProcessor.java | 22 +-
.../view/facelets/compiler/AbstractUIHandler.java | 8 +-
.../compiler/AddFacesMessageInstruction.java | 4 +-
.../facelets/compiler/AttributeInstruction.java | 4 +-
.../compiler/BodyEndElementInstruction.java | 4 +-
.../compiler/CheckDuplicateIdFaceletUtils.java | 10 +-
.../view/facelets/compiler/CommentInstruction.java | 2 +-
.../view/facelets/compiler/CompilationManager.java | 14 +-
.../view/facelets/compiler/CompilationUnit.java | 14 +-
.../myfaces/view/facelets/compiler/Compiler.java | 10 +-
.../facelets/compiler/CompositeComponentUnit.java | 2 +-
.../compiler/CompositeTextInstruction.java | 2 +-
.../DefaultFaceletConfigResourceProvider.java | 2 +-
.../view/facelets/compiler/DoctypeInstruction.java | 2 +-
.../view/facelets/compiler/DoctypeUnit.java | 4 +-
.../facelets/compiler/DuplicateIdException.java | 4 +-
.../facelets/compiler/DynamicComponentFacelet.java | 6 +-
.../view/facelets/compiler/EncodingHandler.java | 10 +-
.../facelets/compiler/EndElementInstruction.java | 2 +-
.../facelets/compiler/FaceletsCompilerSupport.java | 14 +-
.../facelets/compiler/FaceletsCompilerUtils.java | 2 +-
.../view/facelets/compiler/Instruction.java | 2 +-
.../compiler/LiteralAttributeInstruction.java | 2 +-
.../compiler/LiteralCommentInstruction.java | 2 +-
.../compiler/LiteralNonExcapedTextInstruction.java | 2 +-
.../facelets/compiler/LiteralTextInstruction.java | 2 +-
.../facelets/compiler/LiteralXMLInstruction.java | 4 +-
.../view/facelets/compiler/NamespaceHandler.java | 12 +-
.../view/facelets/compiler/NamespaceUnit.java | 2 +-
.../compiler/RefreshDynamicComponentListener.java | 14 +-
.../myfaces/view/facelets/compiler/RemoveUnit.java | 2 +-
.../view/facelets/compiler/SAXCompiler.java | 14 +-
.../facelets/compiler/StartElementInstruction.java | 2 +-
.../view/facelets/compiler/TagLibraryConfig.java | 24 +-
.../compiler/TagLibraryConfigUnmarshallerImpl.java | 2 +-
.../myfaces/view/facelets/compiler/TagUnit.java | 6 +-
.../view/facelets/compiler/TextInstruction.java | 4 +-
.../myfaces/view/facelets/compiler/TextUnit.java | 12 +-
.../view/facelets/compiler/TrimmedTagUnit.java | 2 +-
.../facelets/compiler/UIInstructionHandler.java | 10 +-
.../view/facelets/compiler/UIInstructions.java | 2 +-
.../myfaces/view/facelets/compiler/UILeaf.java | 34 +-
.../view/facelets/compiler/XMLInstruction.java | 4 +-
.../view/facelets/compiler/_ComponentUtils.java | 26 +-
.../facelets/component/JsfElementRenderer.java | 16 +-
.../view/facelets/component/RepeatRenderer.java | 8 +-
.../myfaces/view/facelets/component/UIRepeat.java | 48 +-
.../facelets/component/_CommonEventConstants.java | 2 +-
.../component/_CommonPropertyConstants.java | 2 +-
.../view/facelets/component/_JsfElement.java | 8 +-
.../el/CacheableValueExpressionWrapper.java | 2 +-
.../facelets/el/CompositeComponentELUtils.java | 6 +-
.../myfaces/view/facelets/el/ContextAware.java | 4 +-
.../view/facelets/el/ContextAwareELException.java | 5 +-
.../view/facelets/el/ContextAwareException.java | 4 +-
.../facelets/el/ContextAwareExceptionWrapper.java | 2 +-
.../el/ContextAwareMethodNotFoundException.java | 5 +-
.../el/ContextAwarePropertyNotFoundException.java | 4 +-
.../ContextAwarePropertyNotWritableException.java | 4 +-
.../el/ContextAwareTagMethodExpression.java | 6 +-
.../el/ContextAwareTagValueExpression.java | 6 +-
.../view/facelets/el/ContextAwareUtils.java | 2 +-
.../el/DefaultContextAwareELException.java | 2 +-
.../apache/myfaces/view/facelets/el/ELText.java | 6 +-
.../facelets/el/FaceletStateValueExpression.java | 6 +-
.../view/facelets/el/LegacyMethodBinding.java | 12 +-
.../myfaces/view/facelets/el/LocationAware.java | 6 +-
.../view/facelets/el/LocationMethodExpression.java | 6 +-
.../view/facelets/el/LocationValueExpression.java | 6 +-
...hodExpressionValueExpressionActionListener.java | 10 +-
...ctMethodExpressionValueExpressionValidator.java | 10 +-
...pressionValueExpressionValueChangeListener.java | 10 +-
.../el/ResourceLocationValueExpression.java | 6 +-
.../view/facelets/el/TagMethodExpression.java | 4 +-
.../view/facelets/el/TagValueExpression.java | 4 +-
.../el/ValueExpressionMethodExpression.java | 4 +-
.../view/facelets/el/VariableMapperWrapper.java | 2 +-
.../facelets/impl/CacheELFaceletCacheImpl.java | 4 +-
.../myfaces/view/facelets/impl/DefaultFacelet.java | 26 +-
.../view/facelets/impl/DefaultFaceletContext.java | 12 +-
.../view/facelets/impl/DefaultFaceletFactory.java | 28 +-
.../facelets/impl/DefaultResourceResolver.java | 6 +-
.../facelets/impl/FaceletCacheFactoryImpl.java | 12 +-
.../view/facelets/impl/FaceletCacheImpl.java | 4 +-
.../impl/FaceletCompositionContextImpl.java | 16 +-
.../view/facelets/impl/TemplateContextImpl.java | 10 +-
.../myfaces/view/facelets/pool/ViewEntry.java | 2 +-
.../myfaces/view/facelets/pool/ViewPool.java | 4 +-
.../view/facelets/pool/ViewPoolFactory.java | 6 +-
.../view/facelets/pool/impl/SoftViewEntry.java | 2 +-
.../facelets/pool/impl/ViewPoolFactoryImpl.java | 4 +-
.../view/facelets/pool/impl/ViewPoolImpl.java | 4 +-
.../view/facelets/pool/impl/WeakViewEntry.java | 2 +-
.../view/facelets/tag/AbstractTagLibrary.java | 58 +-
.../facelets/tag/BaseMultipleTagDecorator.java | 4 +-
.../view/facelets/tag/BaseTagDecorator.java | 4 +-
.../view/facelets/tag/BeanPropertyTagRule.java | 12 +-
.../tag/ComponentTagDeclarationLibrary.java | 19 +-
.../view/facelets/tag/CompositeFaceletHandler.java | 12 +-
.../view/facelets/tag/CompositeTagDecorator.java | 6 +-
.../view/facelets/tag/CompositeTagLibrary.java | 6 +-
.../view/facelets/tag/LegacyUserTagHandler.java | 18 +-
.../apache/myfaces/view/facelets/tag/MetaRule.java | 8 +-
.../myfaces/view/facelets/tag/MetaRulesetImpl.java | 16 +-
.../view/facelets/tag/MetaTagHandlerImpl.java | 6 +-
.../myfaces/view/facelets/tag/MetadataImpl.java | 4 +-
.../view/facelets/tag/MetadataTargetImpl.java | 2 +-
.../myfaces/view/facelets/tag/MethodRule.java | 12 +-
.../view/facelets/tag/TagAttributeImpl.java | 10 +-
.../view/facelets/tag/TagAttributesImpl.java | 4 +-
.../view/facelets/tag/TagHandlerFactory.java | 6 +-
.../myfaces/view/facelets/tag/TagHandlerUtils.java | 20 +-
.../myfaces/view/facelets/tag/TagLibrary.java | 6 +-
.../myfaces/view/facelets/tag/UserTagHandler.java | 20 +-
.../ActionSource2AttachedObjectTargetImpl.java | 2 +-
.../tag/composite/ActionSourceHandler.java | 6 +-
.../tag/composite/AttachedObjectTargetHandler.java | 12 +-
.../tag/composite/AttachedObjectTargetImpl.java | 6 +-
.../facelets/tag/composite/AttributeHandler.java | 16 +-
.../ClientBehaviorAttachedObjectTarget.java | 2 +-
.../ClientBehaviorAttachedObjectTargetImpl.java | 8 +-
.../tag/composite/ClientBehaviorHandler.java | 12 +-
...directBehaviorAttachedObjectHandlerWrapper.java | 8 +-
...lientBehaviorRedirectEventComponentWrapper.java | 36 +-
.../tag/composite/CompositeComponentBeanInfo.java | 2 +-
.../CompositeComponentDefinitionTagHandler.java | 6 +-
.../CompositeComponentResourceTagHandler.java | 70 +-
.../tag/composite/CompositeComponentRule.java | 12 +-
.../facelets/tag/composite/CompositeLibrary.java | 4 +-
.../tag/composite/CompositeMetaRulesetImpl.java | 18 +-
.../tag/composite/CompositeMetadataTargetImpl.java | 4 +-
.../tag/composite/CompositeResouceWrapper.java | 6 +-
.../tag/composite/CompositeResourceLibrary.java | 24 +-
.../tag/composite/CompositeTagAttributeUtils.java | 6 +-
.../CreateDynamicCompositeComponentListener.java | 14 +-
...ditableValueHolderAttachedObjectTargetImpl.java | 2 +-
.../tag/composite/EditableValueHolderHandler.java | 6 +-
.../facelets/tag/composite/ExtensionHandler.java | 8 +-
.../view/facelets/tag/composite/FacetHandler.java | 16 +-
.../tag/composite/ImplementationHandler.java | 12 +-
.../tag/composite/InsertChildrenHandler.java | 8 +-
.../facelets/tag/composite/InsertFacetHandler.java | 12 +-
.../facelets/tag/composite/InterfaceHandler.java | 18 +-
.../facelets/tag/composite/RenderFacetHandler.java | 12 +-
.../composite/RetargetMethodExpressionRule.java | 12 +-
.../ValueHolderAttachedObjectTargetImpl.java | 2 +-
.../facelets/tag/composite/ValueHolderHandler.java | 6 +-
.../view/facelets/tag/jsf/ActionSourceRule.java | 18 +-
.../tag/jsf/BehaviorTagHandlerDelegate.java | 28 +-
.../jsf/ClearBindingValueExpressionListener.java | 6 +-
.../facelets/tag/jsf/ComponentBuilderHandler.java | 4 +-
.../view/facelets/tag/jsf/ComponentHandler.java | 37 +-
.../jsf/ComponentRelocatableResourceHandler.java | 6 +-
.../view/facelets/tag/jsf/ComponentRule.java | 12 +-
.../view/facelets/tag/jsf/ComponentSupport.java | 24 +-
.../tag/jsf/ComponentTagHandlerDelegate.java | 65 +-
.../view/facelets/tag/jsf/ConvertHandler.java | 38 +-
.../tag/jsf/ConverterTagHandlerDelegate.java | 28 +-
.../facelets/tag/jsf/EditableValueHolderRule.java | 22 +-
.../view/facelets/tag/jsf/ElementNameRule.java | 8 +-
.../view/facelets/tag/jsf/FaceletState.java | 8 +-
.../view/facelets/tag/jsf/JsfElementHandler.java | 7 +-
.../myfaces/view/facelets/tag/jsf/JsfLibrary.java | 2 +-
.../jsf/PartialMethodExpressionActionListener.java | 6 +-
.../tag/jsf/PartialMethodExpressionValidator.java | 6 +-
...PartialMethodExpressionValueChangeListener.java | 6 +-
.../view/facelets/tag/jsf/PassthroughRuleImpl.java | 12 +-
.../view/facelets/tag/jsf/PreDisposeViewEvent.java | 8 +-
.../tag/jsf/RelocatableResourceHandler.java | 4 +-
.../tag/jsf/TagHandlerDelegateFactoryImpl.java | 12 +-
.../view/facelets/tag/jsf/ValidateHandler.java | 28 +-
.../tag/jsf/ValidatorTagHandlerDelegate.java | 26 +-
.../view/facelets/tag/jsf/ValueHolderRule.java | 16 +-
.../tag/jsf/core/ActionListenerHandler.java | 40 +-
.../view/facelets/tag/jsf/core/AjaxHandler.java | 48 +-
.../facelets/tag/jsf/core/AttributeHandler.java | 26 +-
.../facelets/tag/jsf/core/AttributesHandler.java | 12 +-
.../tag/jsf/core/ConvertDateTimeHandler.java | 26 +-
.../tag/jsf/core/ConvertDelegateHandler.java | 20 +-
.../tag/jsf/core/ConvertNumberHandler.java | 24 +-
.../view/facelets/tag/jsf/core/CoreLibrary.java | 36 +-
.../view/facelets/tag/jsf/core/EventHandler.java | 40 +-
.../view/facelets/tag/jsf/core/FacetHandler.java | 24 +-
.../facelets/tag/jsf/core/LoadBundleHandler.java | 24 +-
.../tag/jsf/core/PassThroughAttributeHandler.java | 21 +-
.../tag/jsf/core/PassThroughAttributesHandler.java | 12 +-
.../tag/jsf/core/PhaseListenerHandler.java | 32 +-
.../jsf/core/ResetValuesActionListenerHandler.java | 40 +-
.../facelets/tag/jsf/core/SelectItemHandler.java | 6 +-
.../facelets/tag/jsf/core/SelectItemsHandler.java | 6 +-
.../jsf/core/SetPropertyActionListenerHandler.java | 32 +-
.../tag/jsf/core/ValidateDelegateHandler.java | 16 +-
.../tag/jsf/core/ValueChangeListenerHandler.java | 36 +-
.../facelets/tag/jsf/core/VerbatimHandler.java | 10 +-
.../view/facelets/tag/jsf/core/ViewHandler.java | 22 +-
.../facelets/tag/jsf/core/ViewMetadataHandler.java | 14 +-
.../facelets/tag/jsf/core/WebsocketHandler.java | 12 +-
.../facelets/tag/jsf/html/DefaultTagDecorator.java | 14 +-
.../tag/jsf/html/HtmlComponentHandler.java | 6 +-
.../view/facelets/tag/jsf/html/HtmlDecorator.java | 8 +-
.../view/facelets/tag/jsf/html/HtmlLibrary.java | 69 +-
.../tag/jsf/html/HtmlOutputScriptHandler.java | 8 +-
.../tag/jsf/html/HtmlOutputStylesheetHandler.java | 8 +-
.../facelets/tag/jsf/html/_HtmlOutputScript.java | 6 +-
.../tag/jsf/html/_HtmlOutputStylesheet.java | 6 +-
.../view/facelets/tag/jstl/core/CatchHandler.java | 14 +-
.../view/facelets/tag/jstl/core/ChooseHandler.java | 18 +-
.../tag/jstl/core/ChooseOtherwiseHandler.java | 12 +-
.../facelets/tag/jstl/core/ChooseWhenHandler.java | 14 +-
.../facelets/tag/jstl/core/ForEachHandler.java | 20 +-
.../view/facelets/tag/jstl/core/IfHandler.java | 16 +-
.../tag/jstl/core/LegacyForEachHandler.java | 16 +-
.../facelets/tag/jstl/core/LegacySetHandler.java | 16 +-
.../view/facelets/tag/jstl/core/SetHandler.java | 16 +-
.../view/facelets/tag/jstl/fn/JstlFnLibrary.java | 6 +-
.../myfaces/view/facelets/tag/ui/ComponentRef.java | 2 +-
.../view/facelets/tag/ui/ComponentRefHandler.java | 4 +-
.../view/facelets/tag/ui/CompositionHandler.java | 18 +-
.../view/facelets/tag/ui/DebugPhaseListener.java | 22 +-
.../view/facelets/tag/ui/DecorateHandler.java | 22 +-
.../view/facelets/tag/ui/DefineHandler.java | 18 +-
.../view/facelets/tag/ui/IncludeHandler.java | 26 +-
.../view/facelets/tag/ui/InsertHandler.java | 18 +-
.../facelets/tag/ui/LegacyCompositionHandler.java | 18 +-
.../facelets/tag/ui/LegacyDecorateHandler.java | 22 +-
.../view/facelets/tag/ui/LegacyIncludeHandler.java | 26 +-
.../view/facelets/tag/ui/LegacyParamHandler.java | 18 +-
.../myfaces/view/facelets/tag/ui/ParamHandler.java | 18 +-
.../view/facelets/tag/ui/RepeatHandler.java | 14 +-
.../myfaces/view/facelets/tag/ui/UIDebug.java | 8 +-
.../myfaces/view/facelets/tag/ui/_Component.java | 4 +-
.../myfaces/view/facelets/tag/ui/_Fragment.java | 4 +-
.../util/FaceletsViewDeclarationLanguageUtils.java | 12 +-
.../myfaces/view/facelets/util/Resource.java | 6 +-
.../myfaces/view/impl/DefaultViewScopeHandler.java | 4 +-
.../view/jsp/JspViewDeclarationLanguage.java | 14 +-
.../jsp/JspViewDeclarationLanguageStrategy.java | 6 +-
.../myfaces/webapp/AbstractFacesInitializer.java | 26 +-
.../myfaces/webapp/FaceletsInitilializer.java | 4 +-
.../myfaces/webapp/FacesELContextListener.java | 2 +-
.../apache/myfaces/webapp/FacesInitializer.java | 2 +-
.../myfaces/webapp/FacesInitializerFactory.java | 2 +-
.../myfaces/webapp/Jsp20FacesInitializer.java | 4 +-
.../myfaces/webapp/Jsp21FacesInitializer.java | 8 +-
.../webapp/ManagedBeanDestroyerListener.java | 6 +-
.../org/apache/myfaces/webapp/MyFacesServlet.java | 4 +-
.../webapp/StartupServletContextListener.java | 4 +-
.../resources/META-INF/WebConfigParamsLogger.vm | 4 +-
.../main/resources/META-INF/componentClass20.vm | 54 +-
impl/src/main/resources/META-INF/faces-config20.vm | 2 +-
impl/src/main/resources/META-INF/myfaces_core12.vm | 2 +-
.../resources/META-INF/myfaces_facelet_core20.vm | 2 +-
.../META-INF/myfaces_facelet_core20_xsd.vm | 2 +-
.../resources/META-INF/myfaces_facelet_html20.vm | 2 +-
.../META-INF/myfaces_facelet_html20_xsd.vm | 2 +-
impl/src/main/resources/META-INF/myfaces_html12.vm | 2 +-
impl/src/main/resources/META-INF/tagClass12.vm | 22 +-
impl/src/main/resources/META-INF/xdoc-component.vm | 2 +-
.../src/main/resources/META-INF/xdoc-web-config.vm | 2 +-
.../java/jakarta/faces/FacesExceptionTest.java | 99 +
.../test/java/jakarta/faces/FactoryFinderTest.java | 287 +++
.../jakarta/faces/application/ApplicationTest.java | 139 +
.../faces/application/FacesMessageTest.java | 244 ++
.../jakarta/faces/application/MockApplication.java | 236 ++
.../faces/application/StateManagerTest.java | 162 ++
.../jakarta/faces/application/ViewHandlerTest.java | 233 ++
.../faces/component/AbstractComponentTest.java | 50 +
.../component/AbstractUIComponentBaseTest.java | 82 +
.../component/AbstractUIComponentPropertyTest.java | 130 +
.../faces/component/InvokeOnComponentTest.java | 283 +++
.../faces/component/UIComponentAttributesTest.java | 67 +
.../UIComponentBaseFacesListenerTest.java | 117 +
.../component/UIComponentBaseGetChildrenTest.java | 191 ++
.../component/UIComponentBaseGetClientIdTest.java | 178 ++
...UIComponentBaseProcessSaveRestoreStateTest.java | 183 ++
.../faces/component/UIComponentBaseTest.java | 427 ++++
.../component/UIComponentBaseValueBindingTest.java | 121 +
.../faces/component/UIComponentEncodeAllTest.java | 124 +
.../UIComponentEventListenerWrapperTest.java | 662 +++++
.../component/UIComponentFindComponentTest.java | 202 ++
.../UIComponentInvokeOnComponentTest.java | 152 ++
.../jakarta/faces/component/UIComponentMock.java | 28 +
.../jakarta/faces/component/UIComponentTest.java | 90 +
.../faces/component/UIComponentTestBase.java | 46 +
.../component/UIComponentValueExpressionTest.java | 144 ++
.../faces/component/UIDataRowStateTest.java | 278 ++
.../java/jakarta/faces/component/UIDataTest.java | 1149 +++++++++
.../jakarta/faces/component/UIGraphicTest.java | 67 +
.../java/jakarta/faces/component/UIInputTest.java | 496 ++++
.../jakarta/faces/component/UIOutputPSSTest.java | 562 ++++
.../jakarta/faces/component/UISelectItemsTest.java | 92 +
.../jakarta/faces/component/UISelectManyTest.java | 181 ++
.../jakarta/faces/component/UISelectOneTest.java | 185 ++
.../faces/component/UIViewParameterTest.java | 86 +
.../jakarta/faces/component/UIViewRootTest.java | 634 +++++
.../component/_AttachedListStateWrapperTest.java | 86 +
.../faces/component/_AttachedStateWrapperTest.java | 98 +
.../faces/component/_ComponentUtilsTest.java | 49 +
.../faces/component/_Delta2StateHelperTest.java | 606 +++++
.../component/_DeltaFacesListenerListTest.java | 521 ++++
.../jakarta/faces/component/_DeltaListTest.java | 775 ++++++
.../faces/component/_DeltaStateHelperTest.java | 304 +++
.../_MethodBindingToMethodExpressionTest.java | 210 ++
.../faces/component/_SelectItemsUtilTest.java | 163 ++
.../faces/component/_SharedRendererUtilsTest.java | 346 +++
.../_ValueBindingToValueExpressionTest.java | 275 ++
.../_ValueExpressionToValueBindingTest.java | 298 +++
.../faces/component/html/HtmlOutputLinkTest.java | 38 +
.../jakarta/faces/context/MockFacesContext.java | 39 +
.../faces/convert/DateTimeConverterTest.java | 111 +
.../jakarta/faces/convert/DoubleConverterTest.java | 157 ++
.../jakarta/faces/convert/EnumConverterTest.java | 185 ++
.../jakarta/faces/convert/MessageUtilsTest.java | 73 +
.../jakarta/faces/convert/NumberConverterTest.java | 205 ++
.../event/MethodExpressionActionListenerTest.java | 160 ++
.../MethodExpressionValueChangeListenerTest.java | 160 ++
.../jakarta/faces/validator/_MessageUtilsTest.java | 75 +
.../src/test/java/org/apache/myfaces/Assert.java | 0
.../java/org/apache/myfaces/FacesTestCase.java | 9 +-
.../test/java/org/apache/myfaces/TestRunner.java | 0
.../application/ApplicationImplAnnotationTest.java | 50 +-
.../application/ApplicationImplJsfTest.java | 29 +-
.../myfaces/application/ApplicationImplTest.java | 40 +-
.../application/ClientBehaviorTestCase.java | 26 +-
.../myfaces/application/MockResourceComponent.java | 2 +-
.../application/NavigationHandlerImplTest.java | 4 +-
.../application/ResourceHandlerImplTest.java | 8 +-
.../myfaces/application/StateManagerImplTest.java | 10 +-
.../myfaces/application/ViewHandlerImplTest.java | 16 +-
...tractsCreateResourceMyFacesRequestTestCase.java | 12 +-
...faultContractsConfigMyFacesRequestTestCase.java | 4 +-
.../SingleContractMyFacesRequestTestCase.java | 12 +-
.../SingleContractNoPSSMyFacesRequestTestCase.java | 2 +-
.../apache/myfaces/application/flow/Flow1Bean.java | 2 +-
.../myfaces/application/flow/Flow21Bean.java | 2 +-
.../apache/myfaces/application/flow/Flow2Bean.java | 2 +-
.../apache/myfaces/application/flow/Flow5Bean.java | 4 +-
.../flow/FlowMyFacesCDIRequestTestCase.java | 16 +-
.../flow/FlowMyFacesRequestTestCase.java | 20 +-
.../FlowResourceHandlerMyFacesRequestTestCase.java | 8 +-
.../viewstate/ClientSideStateCacheTest.java | 2 +-
.../SerializedViewCollectionTestCase.java | 2 +-
.../viewstate/ServerSideStateCacheTest.java | 4 +-
.../cdi/bean/CDIGenericConverterValidatorTest.java | 8 +-
.../apache/myfaces/cdi/bean/CustomConverter.java | 8 +-
.../apache/myfaces/cdi/bean/CustomValidator.java | 12 +-
.../bean/DynamicManagedPropertyProducerTest.java | 2 +-
.../myfaces/cdi/bean/ManagedPropertyBean.java | 2 +-
.../myfaces/component/search/SearchBean.java | 4 +-
.../component/search/SearchExpressionImplTest.java | 20 +-
...FacesConfiguratorDefaultValidatorsTestCase.java | 12 +-
.../myfaces/config/ManagedBeanBuilderTest.java | 8 +-
.../myfaces/config/OrderingFacesConfigTest.java | 2 +-
.../ClassByteCodeAnnotationFilterTest.java | 2 +-
.../myfaces/context/ExecutePhaseClientIdsTest.java | 6 +-
.../org/apache/myfaces/context/IsRenderedTest.java | 6 +-
.../myfaces/context/RenderPhaseClientIdsTest.java | 6 +-
.../myfaces/context/ResponseWrapperSwitchTest.java | 6 +-
.../apache/myfaces/context/TestIsAjaxRequest.java | 6 +-
.../context/servlet/FacesContextImplBaseTest.java | 12 +-
.../java/org/apache/myfaces/dummy/data/Data.java | 0
.../convert/ValueBindingToValueExpressionTest.java | 17 +-
.../convert/ValueExpressionToValueBindingTest.java | 31 +-
.../myfaces/el/unified/NoOpPropertyResolver.java | 6 +-
.../el/unified/ResolverBuilderBaseTest.java | 4 +-
.../unified/resolver/ManagedBeanResolverTest.java | 8 +-
.../event/PostAddToViewEventNoPssTestCase.java | 14 +-
.../myfaces/event/PostAddToViewEventTestCase.java | 20 +-
.../apache/myfaces/flow/FlowBuilderTestCase.java | 22 +-
.../lifecycle/DefaultRestoreViewSupportTest.java | 18 +-
.../myfaces/lifecycle/DummyPhaseListenerA.java | 8 +-
.../myfaces/lifecycle/DummyPhaseListenerB.java | 6 +-
.../lifecycle/InstrumentingPhaseListener.java | 6 +-
.../lifecycle/MyFacesRequestJUnitTestCase.java | 1 -
.../lifecycle/RenderResponseExecutorTest.java | 2 +-
.../myfaces/lifecycle/RestoreViewExecutorTest.java | 27 +-
.../core/AbstractMyFacesCDIRequestTestCase.java | 4 +-
.../test/core/AbstractMyFacesFaceletsTestCase.java | 8 +-
.../test/core/AbstractMyFacesRequestTestCase.java | 6 +-
.../mc/test/core/AbstractMyFacesTestCase.java | 50 +-
.../test/core/annotation/DeclareFacesConfig.java | 2 +-
.../mock/MockDefaultViewDeclarationLanguage.java | 28 +-
...MockDefaultViewDeclarationLanguageStrategy.java | 2 +-
.../mc/test/core/mock/MockMyFacesClient.java | 36 +-
.../MockMyFacesFaceletViewDeclarationLanguage.java | 10 +-
...acesFaceletViewDeclarationLanguageStrategy.java | 8 +-
.../MockMyFacesViewDeclarationLanguageFactory.java | 6 +-
.../mc/test/core/mock/ServletMockContainer.java | 2 +-
.../runner/AbstractJsfRequestTestContainer.java | 8 +-
.../test/core/runner/AbstractJsfTestContainer.java | 51 +-
.../mc/test/core/runner/MyFacesTestRunner.java | 2 +-
.../apache/myfaces/mock/ExceptionMockRunner.java | 0
.../myfaces/mock/MockRenderedValueExpression.java | 69 +
.../java/org/apache/myfaces/mock/MockRunner.java | 0
.../myfaces/mock/api/Mock2ApplicationFactory.java | 54 +
.../myfaces/mock/api/MockApplicationFactory.java | 51 +
.../myfaces/renderkit/ErrorPageWriterTest.java | 5 +-
.../renderkit/html/HtmlBodyRendererTest.java | 2 +-
.../renderkit/html/HtmlButtonRendererTest.java | 16 +-
.../renderkit/html/HtmlCheckboxRendererTest.java | 8 +-
.../renderkit/html/HtmlDoctypeRendererTest.java | 2 +-
.../renderkit/html/HtmlEscapeRendererTest.java | 22 +-
.../renderkit/html/HtmlFormRendererTest.java | 4 +-
.../renderkit/html/HtmlFormatRendererTest.java | 4 +-
.../renderkit/html/HtmlGridRendererTest.java | 8 +-
.../renderkit/html/HtmlGroupRendererTest.java | 6 +-
.../renderkit/html/HtmlHeadRendererTest.java | 2 +-
.../renderkit/html/HtmlImageRendererTest.java | 4 +-
.../renderkit/html/HtmlLabelRendererTest.java | 10 +-
.../renderkit/html/HtmlLinkRendererTest.java | 17 +-
.../renderkit/html/HtmlListboxRendererTest.java | 12 +-
.../renderkit/html/HtmlMenuRendererTest.java | 12 +-
.../renderkit/html/HtmlMessageRendererTest.java | 10 +-
.../renderkit/html/HtmlMessagesRendererTest.java | 6 +-
.../html/HtmlOutcomeTargetButtonRendererTest.java | 8 +-
.../renderkit/html/HtmlRadioRendererTest.java | 10 +-
.../html/HtmlRolePassedThroughTestCase.java | 6 +-
.../renderkit/html/HtmlSecretRendererTest.java | 4 +-
.../renderkit/html/HtmlTableRendererTest.java | 10 +-
.../renderkit/html/HtmlTextRendererTest.java | 18 +-
.../renderkit/html/HtmlTextareaRendererTest.java | 4 +-
.../behavior/AbstractClientBehaviorTestCase.java | 24 +-
.../HtmlBodyClientBehaviorRendererTest.java | 8 +-
...tmlCommandButtonClientBehaviorRendererTest.java | 4 +-
.../HtmlCommandLinkClientBehaviorRendererTest.java | 6 +-
.../HtmlDataTableClientBehaviorRendererTest.java | 4 +-
.../HtmlFormClientBehaviorRendererTest.java | 4 +-
...HtmlGraphicImageClientBehaviorRendererTest.java | 4 +-
...comeTargetButtonClientBehaviorRendererTest.java | 4 +-
...utcomeTargetLinkClientBehaviorRendererTest.java | 4 +-
.../HtmlOutputLabelClientBehaviorRendererTest.java | 4 +-
.../HtmlOutputLinkClientBehaviorRendererTest.java | 4 +-
.../HtmlPanelGridClientBehaviorRendererTest.java | 4 +-
.../HtmlSecretClientBehaviorRendererTest.java | 4 +-
...tBooleanCheckboxClientBehaviorRendererTest.java | 4 +-
...lectManyCheckboxClientBehaviorRendererTest.java | 13 +-
...electManyListboxClientBehaviorRendererTest.java | 6 +-
...mlSelectManyMenuClientBehaviorRendererTest.java | 6 +-
...SelectOneListboxClientBehaviorRendererTest.java | 6 +-
...tmlSelectOneMenuClientBehaviorRendererTest.java | 6 +-
...mlSelectOneRadioClientBehaviorRendererTest.java | 10 +-
.../HtmlTextClientBehaviorRendererTest.java | 4 +-
.../HtmlTextareaClientBehaviorRendererTest.java | 4 +-
.../myfaces/renderkits/OwnRenderKitImpl.java | 10 +-
.../myfaces/renderkits/OwnRenderkitTest.java | 12 +-
.../CustomFactoryFinderProviderFactoryImpl.java | 2 +-
.../myfaces/spi/FactoryFinderProviderTest.java | 2 +-
.../myfaces/taglib/html/HtmlFormTagTest.java | 2 +-
.../test/utils/HtmlCheckAttributesUtil.java | 4 +-
.../myfaces/test/utils/MockTestViewHandler.java | 2 +-
.../myfaces/view/facelets/BrokenTestCase.java | 2 +-
...DefaultFaceletsStateManagementStrategyTest.java | 46 +-
.../myfaces/view/facelets/EncodingTestCase.java | 2 +-
.../myfaces/view/facelets/ExceptionTestCase.java | 34 +-
.../facelets/FaceletMultipleRequestsTestCase.java | 24 +-
.../myfaces/view/facelets/FaceletTestCase.java | 24 +-
.../FaceletViewDeclarationLanguageTest.java | 10 +-
.../view/facelets/InstructionsTestCase.java | 4 +-
.../MockFaceletViewDeclarationLanguage.java | 10 +-
.../StateManagerWithFaceletsClientSideTest.java | 2 +-
.../facelets/StateManagerWithFaceletsTest.java | 8 +-
.../apache/myfaces/view/facelets/TagTestCase.java | 8 +-
.../view/facelets/TemplateClientTestCase.java | 2 +-
.../myfaces/view/facelets/bean/DummyBean.java | 9 +-
.../myfaces/view/facelets/bean/HelloWorld.java | 12 +-
.../compiler/CompressSpacesTextUnitTestCase.java | 2 +-
.../compiler/DynamicComponentFaceletTestCase.java | 2 +-
.../view/facelets/compiler/ELParserTestCase.java | 12 +-
.../compiler/HTML5FaceletsProcessingTestCase.java | 30 +-
.../compiler/JSPXFaceletsProcessingTestCase.java | 28 +-
.../facelets/compiler/SkipNamespaceUnitTest.java | 4 +-
.../compiler/UniqueComponentIdTestCase.java | 17 +-
.../view/facelets/compiler/WhitespaceTestCase.java | 32 +-
.../compiler/XHTMLFaceletsProcessingTestCase.java | 28 +-
.../compiler/XMLFaceletsProcessingTestCase.java | 28 +-
.../view/facelets/component/UIRepeatTest.java | 16 +-
.../CacheELExpressionsAlwaysRecompileTestCase.java | 4 +-
.../facelets/el/CacheELExpressionsTestCase.java | 4 +-
.../el/SerializableELExpressionsTestCase.java | 4 +-
.../view/facelets/impl/ResourceMarkDeleteTest.java | 6 +-
.../mock/MockViewDeclarationLanguageFactory.java | 6 +-
.../myfaces/view/facelets/pool/DynamicBean.java | 4 +-
.../view/facelets/pool/SimpleRequestBean.java | 16 +-
.../view/facelets/pool/StateHolderConverter.java | 12 +-
.../view/facelets/pool/UISimpleComponentA.java | 6 +-
.../myfaces/view/facelets/pool/ViewParamBean.java | 4 +-
.../facelets/pool/ViewPoolFaceletsTestCase.java | 14 +-
.../pool/ViewPoolMyFacesRequestTestCase.java | 22 +-
.../acid/AcidARCacheELMyFacesRequestTestCase.java | 1 -
.../pss/acid/AcidMyFacesRequestTestCase.java | 20 +-
.../pss/acid/AcidNoPssMyFacesRequestTestCase.java | 2 +-
.../acid/AcidPssRefreshMyFacesRequestTestCase.java | 2 +-
...RefreshPreserveStateMyFacesRequestTestCase.java | 2 +-
.../pss/acid/component/UIAddComponent.java | 18 +-
.../pss/acid/component/UIAddSimpleCCVDL.java | 22 +-
.../pss/acid/component/UIAddSimpleCCVDL2.java | 20 +-
.../pss/acid/component/UIAddSimpleCCVDL3.java | 22 +-
.../pss/acid/component/UIAddSimpleCCVDL4.java | 22 +-
.../pss/acid/component/UIAddSimpleCCVDL5.java | 20 +-
.../pss/acid/component/UIAddSimpleCCVDL6.java | 20 +-
.../pss/acid/component/UIAddSimpleCCVDL7.java | 22 +-
.../acid/component/UIAddSimpleComponentVDL.java | 22 +-
.../pss/acid/component/UIAddSimpleIncludeVDL.java | 20 +-
.../pss/acid/component/UIAddSimpleIncludeVDL2.java | 20 +-
.../pss/acid/component/UIDynamicFormComponent.java | 18 +-
.../pss/acid/component/UIInputComponent.java | 22 +-
.../facelets/pss/acid/component/UIRDComponent.java | 6 +-
.../pss/acid/component/UIRecursiveComponent.java | 18 +-
.../pss/acid/component/UISelfRenderComponent.java | 16 +-
.../pss/acid/component/UISimpleComponent1.java | 12 +-
.../pss/acid/component/UISimpleComponent2.java | 14 +-
.../pss/acid/component/UIStableComponent.java | 18 +-
.../pss/acid/component/UITableComponent.java | 24 +-
.../pss/acid/component/UIToggleComponent.java | 20 +-
.../pss/acid/managed/CheckActionEventBean.java | 6 +-
.../pss/acid/managed/ComponentBindingBean.java | 14 +-
.../pss/acid/managed/ComponentBindingFormBean.java | 10 +-
.../pss/acid/managed/ComponentBindingVDLBean1.java | 16 +-
.../pss/acid/managed/ComponentBindingVDLBean2.java | 16 +-
.../pss/acid/managed/ComponentBindingVDLBean3.java | 16 +-
.../pss/acid/managed/ComponentBindingVDLBean4.java | 16 +-
.../pss/acid/managed/ComponentBindingVDLBean5.java | 16 +-
.../pss/acid/managed/ComponentBindingVDLBean6.java | 16 +-
.../pss/acid/managed/ComponentBindingVDLBean7.java | 16 +-
.../pss/acid/managed/CustomSessionBean.java | 4 +-
.../facelets/pss/acid/managed/ForEachBean.java | 6 +-
.../pss/acid/managed/ProbeManagedBean.java | 4 +-
.../pss/acid/managed/ResourceDependencyBean.java | 4 +-
.../view/facelets/pss/acid/managed/TestBean.java | 4 +-
.../pss/acid/renderkit/ProbeComponentRenderer.java | 8 +-
.../view/facelets/stateless/StatelessTest.java | 10 +-
.../view/facelets/tag/TagAttributesImplTest.java | 2 +-
.../CompositeComponentActionListenerTestCase.java | 14 +-
.../CompositeComponentAttributeTestCase.java | 24 +-
.../CompositeComponentBeanValidationTest.java | 6 +-
.../composite/CompositeComponentCCRefTestCase.java | 6 +-
.../CompositeComponentCConIncludeTestCase.java | 2 +-
.../CompositeComponentClientBehaviorTestCase.java | 8 +-
...ompositeComponentConditionalButtonTestCase.java | 10 +-
...CompositeComponentMethodExpressionTestCase.java | 12 +-
.../CompositeComponentNestedCCTestCase.java | 4 +-
.../tag/composite/CompositeComponentTestCase.java | 26 +-
.../CompositeComponentValidatorTestCase.java | 12 +-
...positeComponentValueChangeListenerTestCase.java | 14 +-
.../tag/composite/CompositeTestComponent.java | 4 +-
.../facelets/tag/composite/MockAttributeBean.java | 14 +-
.../composite/SerializableAttributesTestCase.java | 2 +-
.../facelets/tag/composite/SimpleComponent.java | 2 +-
.../tag/composite/SimpleComponentTagHandler.java | 16 +-
.../facelets/tag/jsf/core/ActionListenerImpl.java | 6 +-
.../view/facelets/tag/jsf/core/CoreTestCase.java | 62 +-
.../tag/jsf/core/ValidateBeanTestCase.java | 8 +-
.../tag/jsf/core/ValueChangeListenerImpl.java | 6 +-
.../tag/jsf/core/ViewMetadataTestCase.java | 14 +-
.../tag/jsf/core/reset/ResetValuesBean.java | 6 +-
.../tag/jsf/core/reset/ResetValuesTestCase.java | 5 +-
.../BeanValidationCDIRequestTestCase.java | 12 +-
.../facelets/tag/jsf/html/DataTableTestCase.java | 22 +-
.../tag/jsf/html/DefaultHtmlDecoratorTestCase.java | 70 +-
.../tag/jsf/html/HtmlOutputLabelTestCase.java | 6 +-
.../tag/jsf/html/HtmlOutputScriptTestCase.java | 4 +-
.../view/facelets/tag/jsf/html/HtmlTestCase.java | 28 +-
.../view/facelets/tag/jsf/html/MockNbsp.java | 2 +-
.../view/facelets/tag/jsf/html/SelectTestCase.java | 30 +-
.../view/facelets/tag/jstl/core/CifTestCase.java | 8 +-
.../view/facelets/tag/jstl/core/CsetTestCase.java | 6 +-
.../facelets/tag/jstl/core/JstlCoreTestCase.java | 25 +-
.../facelets/tag/ui/DefineIncludeTestCase.java | 2 +-
.../facelets/tag/ui/ELExprTemplateTestCase.java | 2 +-
.../view/facelets/tag/ui/IncludeParamTestCase.java | 22 +-
.../view/facelets/tag/ui/RemoveTestCase.java | 24 +-
.../view/facelets/tag/ui/RepeatTestCase.java | 18 +-
.../view/facelets/tag/ui/TemplateTestCase.java | 4 +-
.../myfaces/view/facelets/tag/ui/TestUserTags.java | 15 +-
.../myfaces/view/facelets/tag/ui/UITestCase.java | 2 +-
.../tag/ui/template/CompositionTestCase.java | 5 +-
.../facelets/tag/ui/template/DecorateTestCase.java | 4 +-
.../facelets/tag/ui/template/IncludeTestCase.java | 5 +-
.../facelets/tag/ui/template/UserTagTestCase.java | 5 +-
...sComponentAnnotationMyFacesRequestTestCase.java | 6 +-
.../test/component/InputTextWithClass.java | 4 +-
.../view/facelets/test/component/MyUIPanel1.java | 4 +-
.../view/facelets/test/component/MyUIPanel2.java | 4 +-
.../test/component/MyUIPanel2Renderer.java | 4 +-
.../view/facelets/test/component/MyUIPanel3.java | 4 +-
.../UpdateHeadDynamicViewTestCase.java | 16 +-
.../updateheadres/managed/AjaxContentBean.java | 6 +-
.../view/jsp/JspViewDeclarationLanguageTest.java | 4 +-
.../myfaces/webapp/FacesELContextListenerTest.java | 8 +-
.../myfaces/webapp/Jsp21FacesInitializerTest.java | 2 +-
.../apache/myfaces/webapp/MyFacesServletTest.java | 6 +-
.../webapp/StartupServletContextListenerTest.java | 6 +-
.../resourcehandler/messages_de.properties | 2 +-
.../resourcehandler/messages_en.properties | 2 +-
.../config/testfiles/default-bean-validator.xml | 2 +-
.../config/testfiles/default-length-validator.xml | 2 +-
.../testfiles/default-required-validator.xml | 2 +-
.../tag/composite/localized/messages_de.properties | 2 +-
.../tag/composite/localized/messages_en.properties | 2 +-
.../tag/composite/localized/messages_es.properties | 2 +-
.../simpleAttributeMethodExpression.xhtml | 6 +-
.../resources/testComposite/simpleFEvent.xhtml | 2 +-
.../tag/composite/testSimpleValueHolder.xhtml | 2 +-
.../view/facelets/tag/jsf/core/converter.xml | 2 +-
.../view/facelets/tag/jsf/core/validator.xml | 2 +-
.../view/facelets/tag/jsf/html/selectOne.xml | 2 +-
.../html/testMultipleTargetHeadOutputScript.xhtml | 10 +-
.../tag/jsf/html/testSimpleOutputScript.xhtml | 2 +-
.../html/testSimpleTargetHeadOutputScript.xhtml | 2 +-
.../view/facelets/updateheadres/ajaxContent.xhtml | 2 +-
parent/pom.xml | 9 +-
pom.xml | 7 +-
shared-public/pom.xml | 6 +-
.../myfaces/shared/util/ClassLoaderUtils.java | 2 +-
.../org/apache/myfaces/shared/util/ClassUtils.java | 4 +-
.../apache/myfaces/shared/util/ComponentUtils.java | 4 +-
.../org/apache/myfaces/shared/util/DebugUtils.java | 4 +-
.../myfaces/shared/util/ExternalContextUtils.java | 2 +-
.../apache/myfaces/shared/util/MessageUtils.java | 18 +-
.../shared/util/ParametrizableFacesMessage.java | 6 +-
.../apache/myfaces/shared/util/RendererUtils.java | 4 +-
.../myfaces/shared/util/SelectItemsIterator.java | 14 +-
.../org/apache/myfaces/shared/util/TagUtils.java | 2 +-
.../myfaces/shared/util/WebConfigParamUtils.java | 4 +-
.../myfaces/shared/util/MessageUtilsTest.java | 36 +-
.../resources/jakarta/faces/Messages.properties | 135 +
.../resources/jakarta/faces/Messages_ca.properties | 127 +
.../resources/jakarta/faces/Messages_de.properties | 129 +
.../resources/jakarta/faces/Messages_en.properties | 129 +
.../resources/jakarta/faces/Messages_es.properties | 127 +
.../resources/jakarta/faces/Messages_fr.properties | 127 +
.../resources/jakarta/faces/Messages_it.properties | 128 +
.../resources/jakarta/faces/Messages_ja.properties | 127 +
.../resources/jakarta/faces/Messages_mt.properties | 135 +
.../resources/jakarta/faces/Messages_nl.properties | 127 +
.../jakarta/faces/Messages_pt_BR.properties | 127 +
.../resources/jakarta/faces/Messages_ru.properties | 127 +
.../jakarta/faces/Messages_zh_CN.properties | 127 +
.../test/resources/javax/faces/Messages.properties | 135 -
.../resources/javax/faces/Messages_ca.properties | 127 -
.../resources/javax/faces/Messages_de.properties | 129 -
.../resources/javax/faces/Messages_en.properties | 129 -
.../resources/javax/faces/Messages_es.properties | 127 -
.../resources/javax/faces/Messages_fr.properties | 127 -
.../resources/javax/faces/Messages_it.properties | 128 -
.../resources/javax/faces/Messages_ja.properties | 127 -
.../resources/javax/faces/Messages_mt.properties | 135 -
.../resources/javax/faces/Messages_nl.properties | 127 -
.../javax/faces/Messages_pt_BR.properties | 127 -
.../resources/javax/faces/Messages_ru.properties | 127 -
.../javax/faces/Messages_zh_CN.properties | 127 -
shared/pom.xml | 6 +-
.../shared/application/CheckedViewIdsCache.java | 4 +-
.../application/DefaultViewHandlerSupport.java | 10 +-
.../application/FacesServletMappingUtils.java | 6 +-
.../shared/application/NavigationUtils.java | 2 +-
.../shared/application/ViewHandlerSupport.java | 2 +-
.../shared/component/ExecuteOnCallback.java | 4 +-
.../myfaces/shared/config/MyfacesConfig.java | 26 +-
.../shared/context/AjaxExceptionHandlerImpl.java | 26 +-
.../shared/context/ExceptionHandlerImpl.java | 16 +-
.../shared/context/ResponseWriterWrapper.java | 4 +-
.../SwitchAjaxExceptionHandlerWrapperImpl.java | 16 +-
.../flash/ClientWindowFlashTokenLRUMap.java | 6 +-
.../myfaces/shared/context/flash/FlashImpl.java | 22 +-
.../context/flash/FlashScopeDisabledException.java | 2 +-
.../shared/context/flash/ReleasableFlash.java | 2 +-
.../shared/el/SimpleActionMethodBinding.java | 10 +-
.../myfaces/shared/renderkit/ContentTypeUtils.java | 2 +-
.../apache/myfaces/shared/renderkit/JSFAttr.java | 2 +-
.../myfaces/shared/renderkit/RendererUtils.java | 60 +-
.../shared/renderkit/_SharedRendererUtils.java | 18 +-
.../renderkit/html/CommonEventConstants.java | 2 +-
.../shared/renderkit/html/CommonEventUtils.java | 10 +-
.../renderkit/html/CommonPropertyConstants.java | 4 +-
.../shared/renderkit/html/CommonPropertyUtils.java | 6 +-
.../renderkit/html/HtmlBodyRendererBase.java | 16 +-
.../renderkit/html/HtmlButtonRendererBase.java | 24 +-
.../renderkit/html/HtmlCheckboxRendererBase.java | 28 +-
.../renderkit/html/HtmlFormRendererBase.java | 18 +-
.../renderkit/html/HtmlGridRendererBase.java | 16 +-
.../renderkit/html/HtmlGroupRendererBase.java | 12 +-
.../renderkit/html/HtmlImageRendererBase.java | 14 +-
.../renderkit/html/HtmlInputFileRendererBase.java | 26 +-
.../shared/renderkit/html/HtmlJavaScriptUtils.java | 6 +-
.../renderkit/html/HtmlLinkRendererBase.java | 34 +-
.../renderkit/html/HtmlListboxRendererBase.java | 20 +-
.../renderkit/html/HtmlMenuRendererBase.java | 20 +-
.../renderkit/html/HtmlMessageRendererBase.java | 24 +-
.../renderkit/html/HtmlMessagesRendererBase.java | 24 +-
.../html/HtmlOutcomeTargetButtonRendererBase.java | 16 +-
.../renderkit/html/HtmlRadioRendererBase.java | 36 +-
.../shared/renderkit/html/HtmlRenderer.java | 10 +-
.../shared/renderkit/html/HtmlRendererUtils.java | 58 +-
.../renderkit/html/HtmlResponseWriterImpl.java | 10 +-
.../renderkit/html/HtmlSecretRendererBase.java | 18 +-
.../renderkit/html/HtmlSelectableRendererBase.java | 16 +-
.../renderkit/html/HtmlTableRendererBase.java | 26 +-
.../renderkit/html/HtmlTextRendererBase.java | 22 +-
.../renderkit/html/HtmlTextareaRendererBase.java | 18 +-
.../shared/renderkit/html/util/FormInfo.java | 2 +-
.../renderkit/html/util/HttpPartWrapper.java | 6 +-
.../renderkit/html/util/JavascriptUtils.java | 2 +-
.../renderkit/html/util/OutcomeTargetUtils.java | 24 +-
.../shared/renderkit/html/util/ResourceUtils.java | 22 +-
.../shared/renderkit/html/util/SelectItemInfo.java | 4 +-
.../renderkit/html/util/SelectItemsUtils.java | 18 +-
.../renderkit/html/util/SharedStringBuilder.java | 2 +-
.../resource/BaseResourceHandlerSupport.java | 12 +-
.../shared/resource/ClassLoaderResourceLoader.java | 4 +-
.../ClassLoaderResourceLoaderIterator.java | 2 +-
.../resource/ContractResourceLoaderWrapper.java | 6 +-
.../resource/ExternalContextResourceLoader.java | 4 +-
.../ExternalContextResourceLoaderIterator.java | 4 +-
.../myfaces/shared/resource/ResourceELUtils.java | 4 +-
.../shared/resource/ResourceHandlerCache.java | 6 +-
.../shared/resource/ResourceHandlerSupport.java | 6 +-
.../myfaces/shared/resource/ResourceImpl.java | 8 +-
.../myfaces/shared/resource/ResourceLoader.java | 4 +-
.../shared/resource/ResourceLoaderWrapper.java | 6 +-
.../resource/ValueExpressionFilterInputStream.java | 8 +-
.../shared/taglib/UIComponentELTagBase.java | 4 +-
.../shared/taglib/UIComponentELTagUtils.java | 26 +-
.../myfaces/shared/taglib/UIComponentTagUtils.java | 30 +-
.../shared/taglib/core/SelectItemTagBase.java | 4 +-
.../org/apache/myfaces/shared/util/StateUtils.java | 6 +-
.../myfaces/shared/util/ViewProtectionUtils.java | 2 +-
.../myfaces/shared/util/_ComponentUtils.java | 6 +-
.../view/JspViewDeclarationLanguageBase.java | 26 +-
.../shared/view/ViewDeclarationLanguageBase.java | 10 +-
.../myfaces/shared/webapp/webxml/WebXml.java | 4 +-
.../myfaces/shared/webapp/webxml/WebXmlParser.java | 4 +-
.../shared/context/flash/FlashImplTest.java | 11 +-
.../shared/renderkit/RendererUtilsTest.java | 22 +-
.../renderkit/html/HtmlRendererUtilsTest.java | 10 +-
.../shared/util/InitVector_CBCTestCase.java | 3 +-
.../myfaces/shared/util/MessageUtilsTest.java | 36 +-
.../resources/jakarta/faces/Messages.properties | 135 +
.../resources/jakarta/faces/Messages_ca.properties | 127 +
.../resources/jakarta/faces/Messages_de.properties | 129 +
.../resources/jakarta/faces/Messages_en.properties | 129 +
.../resources/jakarta/faces/Messages_es.properties | 127 +
.../resources/jakarta/faces/Messages_fr.properties | 127 +
.../resources/jakarta/faces/Messages_it.properties | 128 +
.../resources/jakarta/faces/Messages_ja.properties | 127 +
.../resources/jakarta/faces/Messages_mt.properties | 135 +
.../resources/jakarta/faces/Messages_nl.properties | 127 +
.../jakarta/faces/Messages_pt_BR.properties | 127 +
.../resources/jakarta/faces/Messages_ru.properties | 127 +
.../jakarta/faces/Messages_zh_CN.properties | 127 +
.../test/resources/javax/faces/Messages.properties | 135 -
.../resources/javax/faces/Messages_ca.properties | 127 -
.../resources/javax/faces/Messages_de.properties | 129 -
.../resources/javax/faces/Messages_en.properties | 129 -
.../resources/javax/faces/Messages_es.properties | 127 -
.../resources/javax/faces/Messages_fr.properties | 127 -
.../resources/javax/faces/Messages_it.properties | 128 -
.../resources/javax/faces/Messages_ja.properties | 127 -
.../resources/javax/faces/Messages_mt.properties | 135 -
.../resources/javax/faces/Messages_nl.properties | 127 -
.../javax/faces/Messages_pt_BR.properties | 127 -
.../resources/javax/faces/Messages_ru.properties | 127 -
.../javax/faces/Messages_zh_CN.properties | 127 -
test/pom.xml | 149 ++
.../myfaces/test/base/AbstractJsfTestCase.java | 356 +++
.../test/base/AbstractViewControllerTestCase.java | 101 +
.../AbstractJsfConfigurableMockTestCase.java | 358 +++
...actJsfConfigurableMultipleRequestsTestCase.java | 398 +++
.../test/base/junit4/AbstractJsfTestCase.java | 359 +++
.../junit4/AbstractViewControllerTestCase.java | 103 +
.../apache/myfaces/test/cargo/CargoTestSetup.java | 179 ++
.../test/config/ResourceBundleVarNames.java | 50 +
.../apache/myfaces/test/el/AbstractELResolver.java | 78 +
.../myfaces/test/el/ExpressionTokenizer.java | 193 ++
.../test/el/FacesImplicitObjectELResolver.java | 317 +++
.../test/el/FacesResourceBundleELResolver.java | 234 ++
.../test/el/FacesScopedAttributeELResolver.java | 269 ++
.../test/el/FacesVariableResolverChainWrapper.java | 143 ++
.../test/el/MockCompositeValueExpression.java | 180 ++
.../org/apache/myfaces/test/el/MockELContext.java | 122 +
.../myfaces/test/el/MockExpressionFactory.java | 365 +++
.../apache/myfaces/test/el/MockFunctionMapper.java | 74 +
.../myfaces/test/el/MockMethodExpression.java | 267 ++
.../myfaces/test/el/MockValueExpression.java | 307 +++
.../apache/myfaces/test/el/MockVariableMapper.java | 80 +
.../test/el/MockVariableValueExpression.java | 215 ++
.../myfaces/test/el/ReservedWordsELResolver.java | 122 +
.../test/htmlunit/AbstractHtmlUnitTestCase.java | 331 +++
.../htmlunit/junit4/AbstractHtmlUnitTestCase.java | 318 +++
.../test/jmock/AbstractJmockJsfTestCase.java | 349 +++
.../myfaces/test/mock/MockActionListener.java | 65 +
.../apache/myfaces/test/mock/MockApplication.java | 84 +
.../myfaces/test/mock/MockApplication10.java | 407 +++
.../myfaces/test/mock/MockApplication12.java | 307 +++
.../myfaces/test/mock/MockApplication20.java | 1192 +++++++++
.../myfaces/test/mock/MockApplication22.java | 62 +
.../myfaces/test/mock/MockApplicationFactory.java | 85 +
.../apache/myfaces/test/mock/MockClientWindow.java | 104 +
.../myfaces/test/mock/MockClientWindowFactory.java | 91 +
.../apache/myfaces/test/mock/MockEnumeration.java | 77 +
.../myfaces/test/mock/MockExceptionHandler.java | 220 ++
.../test/mock/MockExceptionHandlerFactory.java | 40 +
.../myfaces/test/mock/MockExternalContext.java | 110 +
.../myfaces/test/mock/MockExternalContext10.java | 540 ++++
.../myfaces/test/mock/MockExternalContext12.java | 117 +
.../myfaces/test/mock/MockExternalContext20.java | 358 +++
.../apache/myfaces/test/mock/MockFacesContext.java | 121 +
.../myfaces/test/mock/MockFacesContext10.java | 330 +++
.../myfaces/test/mock/MockFacesContext12.java | 116 +
.../myfaces/test/mock/MockFacesContext20.java | 183 ++
.../myfaces/test/mock/MockFacesContextFactory.java | 144 ++
.../org/apache/myfaces/test/mock/MockFlash.java | 821 ++++++
.../apache/myfaces/test/mock/MockFlowHandler.java | 90 +
.../myfaces/test/mock/MockHttpServletRequest.java | 1113 ++++++++
.../myfaces/test/mock/MockHttpServletResponse.java | 480 ++++
.../apache/myfaces/test/mock/MockHttpSession.java | 454 ++++
.../myfaces/test/mock/MockHttpSessionProxy.java | 205 ++
.../myfaces/test/mock/MockNavigationHandler.java | 110 +
.../myfaces/test/mock/MockPartialViewContext.java | 375 +++
.../test/mock/MockPartialViewContextFactory.java | 41 +
.../myfaces/test/mock/MockPortletContext.java | 358 +++
.../myfaces/test/mock/MockPortletRequest.java | 436 ++++
.../myfaces/test/mock/MockPortletResponse.java | 67 +
.../myfaces/test/mock/MockPortletSession.java | 291 +++
.../apache/myfaces/test/mock/MockPrincipal.java | 79 +
.../apache/myfaces/test/mock/MockPrintWriter.java | 84 +
.../myfaces/test/mock/MockPropertyResolver.java | 293 +++
.../apache/myfaces/test/mock/MockRenderKit.java | 145 ++
.../myfaces/test/mock/MockRenderKitFactory.java | 117 +
.../myfaces/test/mock/MockRequestDispatcher.java | 60 +
.../test/mock/MockResponseStateManager.java | 396 +++
.../myfaces/test/mock/MockResponseWriter.java | 428 ++++
.../org/apache/myfaces/test/mock/MockServlet.java | 119 +
.../myfaces/test/mock/MockServletConfig.java | 124 +
.../myfaces/test/mock/MockServletContext.java | 794 ++++++
.../myfaces/test/mock/MockServletInputStream.java | 73 +
.../myfaces/test/mock/MockServletOutputStream.java | 106 +
.../myfaces/test/mock/MockServletRegistration.java | 101 +
.../apache/myfaces/test/mock/MockStateManager.java | 112 +
.../apache/myfaces/test/mock/MockSubKeyMap.java | 315 +++
.../myfaces/test/mock/MockVariableResolver.java | 161 ++
.../apache/myfaces/test/mock/MockViewHandler.java | 170 ++
.../myfaces/test/mock/MockViewHandler20.java | 52 +
.../apache/myfaces/test/mock/MockWebContainer.java | 299 +++
.../myfaces/test/mock/MockedJsfTestContainer.java | 414 +++
.../myfaces/test/mock/_AbstractAttributeMap.java | 448 ++++
.../apache/myfaces/test/mock/_ApplicationMap.java | 78 +
.../org/apache/myfaces/test/mock/_CookieMap.java | 167 ++
.../java/org/apache/myfaces/test/mock/_ELText.java | 444 ++++
.../java/org/apache/myfaces/test/mock/_Hex.java | 341 +++
.../myfaces/test/mock/_InitParameterMap.java | 80 +
.../apache/myfaces/test/mock/_NullEnumeration.java | 49 +
.../myfaces/test/mock/_RequestHeaderMap.java | 80 +
.../myfaces/test/mock/_RequestHeaderValuesMap.java | 93 +
.../org/apache/myfaces/test/mock/_RequestMap.java | 78 +
.../myfaces/test/mock/_RequestParameterMap.java | 67 +
.../test/mock/_RequestParameterValuesMap.java | 67 +
.../org/apache/myfaces/test/mock/_SessionMap.java | 88 +
.../mock/lifecycle/ApplyRequestValuesExecutor.java | 45 +
.../mock/lifecycle/DefaultRestoreViewSupport.java | 122 +
.../mock/lifecycle/InvokeApplicationExecutor.java | 45 +
.../myfaces/test/mock/lifecycle/MockLifecycle.java | 201 ++
.../test/mock/lifecycle/MockLifecycleFactory.java | 87 +
.../myfaces/test/mock/lifecycle/PhaseExecutor.java | 49 +
.../test/mock/lifecycle/PhaseListenerManager.java | 124 +
.../mock/lifecycle/ProcessValidationsExecutor.java | 43 +
.../mock/lifecycle/RenderResponseExecutor.java | 60 +
.../test/mock/lifecycle/RestoreViewExecutor.java | 197 ++
.../test/mock/lifecycle/RestoreViewSupport.java | 74 +
.../mock/lifecycle/UpdateModelValuesExecutor.java | 45 +
.../resource/MockClassLoaderResourceLoader.java | 130 +
.../MockExternalContextResourceLoader.java | 223 ++
.../myfaces/test/mock/resource/MockResource.java | 105 +
.../test/mock/resource/MockResourceHandler.java | 401 +++
.../mock/resource/MockResourceHandlerSupport.java | 124 +
.../test/mock/resource/MockResourceLoader.java | 158 ++
.../test/mock/resource/MockResourceMeta.java | 123 +
.../test/mock/resource/MockSimpleResource.java | 200 ++
.../mock/resource/MockSimpleResourceHandler.java | 410 +++
.../myfaces/test/mock/visit/FullVisitContext.java | 148 ++
.../myfaces/test/mock/visit/MockVisitCallback.java | 41 +
.../myfaces/test/mock/visit/MockVisitContext.java | 106 +
.../test/mock/visit/MockVisitContextFactory.java | 53 +
.../test/mock/visit/PartialVisitContext.java | 469 ++++
.../apache/myfaces/test/runners/NamedRunner.java | 126 +
.../myfaces/test/runners/TestClassLoader.java | 359 +++
.../test/runners/TestPerClassLoaderRunner.java | 299 +++
.../org/apache/myfaces/test/util/Jsf11Utils.java | 30 +
.../org/apache/myfaces/test/util/Jsf12Utils.java | 39 +
.../org/apache/myfaces/test/util/JsfVersion.java | 78 +
2296 files changed, 115306 insertions(+), 88456 deletions(-)
diff --git a/api/pom.xml b/api/pom.xml
index c831a1c..8c1f104 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -102,7 +102,7 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
- <excludes>javax/faces/component/**/*.java</excludes>
+ <excludes>jakarta/faces/component/**/*.java</excludes>
</configuration>
</plugin>
@@ -136,7 +136,7 @@
<phase>process-resources</phase>
<configuration>
<descriptor>${basedir}/src/assembler/jsfscripts-uncompressed-compiler.xml</descriptor>
- <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/javax.faces/</outputDirectory>
+ <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/jakarta.faces/</outputDirectory>
<excludes>
<exclude>**/myfaces/_impl/core/Impl.js</exclude>
<exclude>**/myfaces/_impl/_util/*</exclude>
@@ -153,7 +153,7 @@
<phase>process-resources</phase>
<configuration>
<descriptor>${basedir}/src/assembler/jsfscripts-uncompressed-full-compiler.xml</descriptor>
- <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/javax.faces/</outputDirectory>
+ <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/jakarta.faces/</outputDirectory>
<excludes>
<exclude>**/myfaces/_impl/core/jsf-uncompressed.js</exclude>
<exclude>**/myfaces/_impl/_util/_UnitTest.js</exclude>
@@ -168,7 +168,7 @@
<phase>process-resources</phase>
<configuration>
<descriptor>${basedir}/src/assembler/jsfscripts-minimal-compiler.xml</descriptor>
- <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/javax.faces/</outputDirectory>
+ <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/jakarta.faces/</outputDirectory>
<excludes>
<exclude>**/myfaces/_impl/core/jsf-uncompressed.js</exclude>
<exclude>**/myfaces/_impl/_util/_UnitTest.js</exclude>
@@ -183,7 +183,7 @@
<phase>process-resources</phase>
<configuration>
<descriptor>${basedir}/src/assembler/jsfscripts-minimal-modern-compiler.xml</descriptor>
- <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/javax.faces/</outputDirectory>
+ <outputDirectory>${basedir}/target/classes/META-INF/internal-resources/jakarta.faces/</outputDirectory>
<excludes>
<exclude>**/myfaces/_impl/core/jsf-uncompressed.js</exclude>
<exclude>**/myfaces/_impl/_util/_UnitTest.js</exclude>
@@ -244,7 +244,7 @@
<phase>process-resources</phase>
<configuration>
- <scripts>target/classes/META-INF/resources/javax.faces/</scripts>
+ <scripts>target/classes/META-INF/resources/jakarta.faces/</scripts>
<excludes>
<exclude>jsf-uncompressed.js</exclude>
<exclude>jsf-uncompressed-full.js</exclude>
@@ -279,7 +279,7 @@
<phase>process-resources</phase>
<configuration>
- <scripts>target/classes/META-INF/internal-resources/javax.faces/</scripts>
+ <scripts>target/classes/META-INF/internal-resources/jakarta.faces/</scripts>
<excludes>
<exclude>jsf-uncompressed.js</exclude>
<exclude>jsf-uncompressed-full.js</exclude>
@@ -293,7 +293,7 @@
<optimizationLevel>0</optimizationLevel>
<sourceDirectory>src/main/javascript</sourceDirectory>
<webappDirectory>${basedir}</webappDirectory>
- <outputDirectory>${basedir}/target/classes/META-INF/resources/javax.faces/</outputDirectory>
+ <outputDirectory>${basedir}/target/classes/META-INF/resources/jakarta.faces/</outputDirectory>
</configuration>
</plugin>
@@ -339,17 +339,17 @@
<sources>
<source>../../../../test/javascript/org/apache/myfaces/mockups/BrowserMockups.js</source>
<!--
- <source>javax/faces/_util/OpenAjax.js</source>
+ <source>jakarta/faces/_util/OpenAjax.js</source>
-->
- <source>javax/faces/_util/_JSF2Utils.js</source>
- <source>javax/faces/ajax/Ajax.js</source>
+ <source>jakarta/faces/_util/_JSF2Utils.js</source>
+ <source>jakarta/faces/ajax/Ajax.js</source>
<source>../../../../test/javascript/org/apache/myfaces/test/_TestScenario.js</source>
</sources>
<testSourceDirectory>src/test/javascript/org/apache/myfaces</testSourceDirectory>
<reportsDirectory>target/surefire-reports</reportsDirectory>
<testSuites>
<testSuite>
- <name>javax.faces.Ajax</name>
+ <name>jakarta.faces.Ajax</name>
<type>TESTSUITES</type>
<includes>
<include>test/MockupTest.js</include>
@@ -417,7 +417,7 @@
javax.servlet.jsp.jstl.sql;version="[1.1.2, 2.0.0)",
javax.servlet.jsp.tagext;version="[2.1.0, 3.2)",
org.apache.commons.logging;version="[1.1.1, 2.0.0)",
- javax.faces.*;version="${project.version}"
+ jakarta.faces.*;version="${project.version}"
</Import-Package>
<Require-Bundle>
org.apache.myfaces.core.impl;bundle-version="${parsedVersion.osgiVersion}"
@@ -522,7 +522,7 @@
<comparisonArtifacts>
<comparisonArtifact>
<groupId>org.glassfish</groupId>
- <artifactId>javax.faces</artifactId>
+ <artifactId>jakarta.faces</artifactId>
<version>2.3.0</version>
</comparisonArtifact>
</comparisonArtifacts>
@@ -662,11 +662,6 @@
<artifactId>junit</artifactId>
</dependency>
- <dependency>
- <groupId>org.apache.myfaces.test</groupId>
- <artifactId>myfaces-test23</artifactId>
- </dependency>
-
<!-- easymock -->
<dependency>
<groupId>org.easymock</groupId>
diff --git a/api/src/main/java/jakarta/faces/FacesException.java b/api/src/main/java/jakarta/faces/FacesException.java
new file mode 100644
index 0000000..0220902
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/FacesException.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public class FacesException extends RuntimeException
+{
+ private static final long serialVersionUID = 6592152487577416317L;
+
+ public FacesException()
+ {
+ super();
+ }
+
+ public FacesException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ public FacesException(String message)
+ {
+ super(message);
+ }
+
+ public FacesException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ @Override
+ public Throwable getCause()
+ {
+ return super.getCause();
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/FacesWrapper.java b/api/src/main/java/jakarta/faces/FacesWrapper.java
new file mode 100644
index 0000000..d479b1f
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/FacesWrapper.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces;
+
+/**
+ * Any wrapper class in JSF that must provide access to the object it wraps must implement this interface.
+ *
+ * @since 2.0
+ */
+public interface FacesWrapper<T>
+{
+ /**
+ * A class that implements this interface uses this method to return an instance of the class being wrapped.
+ *
+ * @return the instance of the class being wrapped
+ */
+ public T getWrapped();
+}
diff --git a/api/src/main/java/jakarta/faces/FactoryFinder.java b/api/src/main/java/jakarta/faces/FactoryFinder.java
new file mode 100644
index 0000000..ceb6af2
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/FactoryFinder.java
@@ -0,0 +1,817 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces;
+
+import jakarta.faces.application.ApplicationFactory;
+import jakarta.faces.component.search.SearchExpressionContextFactory;
+import jakarta.faces.lifecycle.ClientWindowFactory;
+import jakarta.faces.lifecycle.LifecycleFactory;
+import jakarta.faces.component.visit.VisitContextFactory;
+import jakarta.faces.context.ExceptionHandlerFactory;
+import jakarta.faces.context.ExternalContextFactory;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.context.FacesContextFactory;
+import jakarta.faces.context.FlashFactory;
+import jakarta.faces.context.PartialViewContextFactory;
+import jakarta.faces.flow.FlowHandlerFactory;
+import jakarta.faces.render.RenderKitFactory;
+import jakarta.faces.view.ViewDeclarationLanguageFactory;
+import jakarta.faces.view.facelets.FaceletCacheFactory;
+import jakarta.faces.view.facelets.TagHandlerDelegateFactory;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public final class FactoryFinder
+{
+ public static final String APPLICATION_FACTORY = "jakarta.faces.application.ApplicationFactory";
+ public static final String EXCEPTION_HANDLER_FACTORY = "jakarta.faces.context.ExceptionHandlerFactory";
+ public static final String EXTERNAL_CONTEXT_FACTORY = "jakarta.faces.context.ExternalContextFactory";
+ public static final String FACES_CONTEXT_FACTORY = "jakarta.faces.context.FacesContextFactory";
+ public static final String LIFECYCLE_FACTORY = "jakarta.faces.lifecycle.LifecycleFactory";
+ public static final String PARTIAL_VIEW_CONTEXT_FACTORY = "jakarta.faces.context.PartialViewContextFactory";
+ public static final String RENDER_KIT_FACTORY = "jakarta.faces.render.RenderKitFactory";
+ public static final String TAG_HANDLER_DELEGATE_FACTORY = "jakarta.faces.view.facelets.TagHandlerDelegateFactory";
+ public static final String VIEW_DECLARATION_LANGUAGE_FACTORY = "jakarta.faces.view.ViewDeclarationLanguageFactory";
+ public static final String VISIT_CONTEXT_FACTORY = "jakarta.faces.component.visit.VisitContextFactory";
+ public static final String FACELET_CACHE_FACTORY = "jakarta.faces.view.facelets.FaceletCacheFactory";
+ public static final String FLASH_FACTORY = "jakarta.faces.context.FlashFactory";
+ public static final String FLOW_HANDLER_FACTORY = "jakarta.faces.flow.FlowHandlerFactory";
+ public static final String CLIENT_WINDOW_FACTORY = "jakarta.faces.lifecycle.ClientWindowFactory";
+ public static final String SEARCH_EXPRESSION_CONTEXT_FACTORY =
+ "jakarta.faces.component.search.SearchExpressionContextFactory";
+
+ /**
+ * used as a monitor for itself and _factories. Maps in this map are used as monitors for themselves and the
+ * corresponding maps in _factories.
+ */
+ private static Map<ClassLoader, Map<String, List<String>>> registeredFactoryNames
+ = new HashMap<ClassLoader, Map<String, List<String>>>();
+
+ /**
+ * Maps from classLoader to another map, the container (i.e. Tomcat) will create a class loader for each web app
+ * that it controls (typically anyway) and that class loader is used as the key.
+ *
+ * The secondary map maps the factory name (i.e. FactoryFinder.APPLICATION_FACTORY) to actual instances that are
+ * created via getFactory. The instances will be of the class specified in the setFactory method for the factory
+ * name, i.e. FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, MyFactory.class).
+ */
+ private static Map<ClassLoader, Map<String, Object>> factories
+ = new HashMap<ClassLoader, Map<String, Object>>();
+
+ private static final Set<String> VALID_FACTORY_NAMES = new HashSet<String>();
+ private static final Map<String, Class<?>> ABSTRACT_FACTORY_CLASSES = new HashMap<String, Class<?>>();
+ private static final ClassLoader MYFACES_CLASSLOADER;
+
+ private static final String INJECTION_PROVIDER_INSTANCE = "oam.spi.INJECTION_PROVIDER_KEY";
+ private static final String INJECTED_BEAN_STORAGE_KEY = "org.apache.myfaces.spi.BEAN_ENTRY_STORAGE";
+ private static final String BEAN_ENTRY_CLASS_NAME = "org.apache.myfaces.cdi.util.BeanEntry";
+
+ private static final Logger LOGGER = Logger.getLogger(FactoryFinder.class.getName());
+
+ static
+ {
+ VALID_FACTORY_NAMES.add(APPLICATION_FACTORY);
+ VALID_FACTORY_NAMES.add(EXCEPTION_HANDLER_FACTORY);
+ VALID_FACTORY_NAMES.add(EXTERNAL_CONTEXT_FACTORY);
+ VALID_FACTORY_NAMES.add(FACES_CONTEXT_FACTORY);
+ VALID_FACTORY_NAMES.add(LIFECYCLE_FACTORY);
+ VALID_FACTORY_NAMES.add(PARTIAL_VIEW_CONTEXT_FACTORY);
+ VALID_FACTORY_NAMES.add(RENDER_KIT_FACTORY);
+ VALID_FACTORY_NAMES.add(TAG_HANDLER_DELEGATE_FACTORY);
+ VALID_FACTORY_NAMES.add(VIEW_DECLARATION_LANGUAGE_FACTORY);
+ VALID_FACTORY_NAMES.add(VISIT_CONTEXT_FACTORY);
+ VALID_FACTORY_NAMES.add(FACELET_CACHE_FACTORY);
+ VALID_FACTORY_NAMES.add(FLASH_FACTORY);
+ VALID_FACTORY_NAMES.add(FLOW_HANDLER_FACTORY);
+ VALID_FACTORY_NAMES.add(CLIENT_WINDOW_FACTORY);
+ VALID_FACTORY_NAMES.add(SEARCH_EXPRESSION_CONTEXT_FACTORY);
+
+ ABSTRACT_FACTORY_CLASSES.put(APPLICATION_FACTORY, ApplicationFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(EXCEPTION_HANDLER_FACTORY, ExceptionHandlerFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(EXTERNAL_CONTEXT_FACTORY, ExternalContextFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(FACES_CONTEXT_FACTORY, FacesContextFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(LIFECYCLE_FACTORY, LifecycleFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(PARTIAL_VIEW_CONTEXT_FACTORY, PartialViewContextFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(RENDER_KIT_FACTORY, RenderKitFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(TAG_HANDLER_DELEGATE_FACTORY, TagHandlerDelegateFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(VIEW_DECLARATION_LANGUAGE_FACTORY, ViewDeclarationLanguageFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(VISIT_CONTEXT_FACTORY, VisitContextFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(FACELET_CACHE_FACTORY, FaceletCacheFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(FLASH_FACTORY, FlashFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(FLOW_HANDLER_FACTORY, FlowHandlerFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(CLIENT_WINDOW_FACTORY, ClientWindowFactory.class);
+ ABSTRACT_FACTORY_CLASSES.put(SEARCH_EXPRESSION_CONTEXT_FACTORY, SearchExpressionContextFactory.class);
+ try
+ {
+ ClassLoader classLoader;
+ if (System.getSecurityManager() != null)
+ {
+ classLoader = (ClassLoader) AccessController.doPrivileged(new java.security.PrivilegedExceptionAction()
+ {
+ public Object run()
+ {
+ return FactoryFinder.class.getClassLoader();
+ }
+ });
+ }
+ else
+ {
+ classLoader = FactoryFinder.class.getClassLoader();
+ }
+
+ if (classLoader == null)
+ {
+ throw new FacesException("jsf api class loader cannot be identified", null);
+ }
+ MYFACES_CLASSLOADER = classLoader;
+ }
+ catch (Exception e)
+ {
+ throw new FacesException("jsf api class loader cannot be identified", e);
+ }
+ }
+
+ // ~ Start FactoryFinderProvider Support
+
+ private static Object factoryFinderProviderFactoryInstance;
+
+ private static volatile boolean initialized = false;
+
+ private static void initializeFactoryFinderProviderFactory()
+ {
+ if (!initialized)
+ {
+ factoryFinderProviderFactoryInstance = _FactoryFinderProviderFactory.getInstance();
+ initialized = true;
+ }
+ }
+
+ // ~ End FactoryFinderProvider Support
+
+ // avoid instantiation
+ FactoryFinder()
+ {
+ }
+
+ /**
+ * <p>
+ * Create (if necessary) and return a per-web-application instance of the appropriate implementation class for the
+ * specified JavaServer Faces factory class, based on the discovery algorithm described in the class description.
+ * </p>
+ *
+ * <p>
+ * The standard factories and wrappers in JSF all implement the interface {@link FacesWrapper}. If the returned
+ * <code>Object</code> is an implementation of one of the standard factories, it must be legal to cast it to an
+ * instance of <code>FacesWrapper</code> and call {@link FacesWrapper#getWrapped()} on the instance.
+ * </p>
+ *
+ * @param factoryName
+ * Fully qualified name of the JavaServer Faces factory for which an implementation instance is requested
+ *
+ * @return A per-web-application instance of the appropriate implementation class for the specified JavaServer Faces
+ * factory class
+ *
+ * @throws FacesException
+ * if the web application class loader cannot be identified
+ * @throws FacesException
+ * if an instance of the configured factory implementation class cannot be loaded
+ * @throws FacesException
+ * if an instance of the configured factory implementation class cannot be instantiated
+ * @throws IllegalArgumentException
+ * if <code>factoryname</code> does not identify a standard JavaServer Faces factory name
+ * @throws IllegalStateException
+ * if there is no configured factory implementation class for the specified factory name
+ * @throws NullPointerException
+ * if <code>factoryname</code> is null
+ */
+ public static Object getFactory(String factoryName) throws FacesException
+ {
+ if (factoryName == null)
+ {
+ throw new NullPointerException("factoryName may not be null");
+ }
+
+ initializeFactoryFinderProviderFactory();
+
+ if (factoryFinderProviderFactoryInstance == null)
+ {
+ // Do the typical stuff
+ return _getFactory(factoryName);
+ }
+ else
+ {
+ try
+ {
+ //Obtain the FactoryFinderProvider instance for this context.
+ Object ffp = _FactoryFinderProviderFactory
+ .FACTORY_FINDER_PROVIDER_FACTORY_GET_FACTORY_FINDER_METHOD
+ .invoke(factoryFinderProviderFactoryInstance, null);
+
+ //Call getFactory method and pass the params
+ return _FactoryFinderProviderFactory
+ .FACTORY_FINDER_PROVIDER_GET_FACTORY_METHOD.invoke(ffp, factoryName);
+ }
+ catch (InvocationTargetException e)
+ {
+ Throwable targetException = e.getCause();
+ if (targetException instanceof NullPointerException)
+ {
+ throw (NullPointerException) targetException;
+ }
+ else if (targetException instanceof FacesException)
+ {
+ throw (FacesException) targetException;
+ }
+ else if (targetException instanceof IllegalArgumentException)
+ {
+ throw (IllegalArgumentException) targetException;
+ }
+ else if (targetException instanceof IllegalStateException)
+ {
+ throw (IllegalStateException) targetException;
+ }
+ else if (targetException == null)
+ {
+ throw new FacesException(e);
+ }
+ else
+ {
+ throw new FacesException(targetException);
+ }
+ }
+ catch (Exception e)
+ {
+ //No Op
+ throw new FacesException(e);
+ }
+ }
+ }
+
+ private static Object _getFactory(String factoryName) throws FacesException
+ {
+ ClassLoader classLoader = getClassLoader();
+
+ // This code must be synchronized because this could cause a problem when
+ // using update feature each time of myfaces (org.apache.myfaces.CONFIG_REFRESH_PERIOD)
+ // In this moment, a concurrency problem could happen
+ Map<String, List<String>> factoryClassNames = null;
+ Map<String, Object> factoryMap = null;
+
+ synchronized (registeredFactoryNames)
+ {
+ factoryClassNames = registeredFactoryNames.get(classLoader);
+
+ if (factoryClassNames == null)
+ {
+ String message
+ = "No Factories configured for this Application. This happens if the faces-initialization "
+ + "does not work at all - make sure that you properly include all configuration "
+ + "settings necessary for a basic faces application "
+ + "and that all the necessary libs are included. Also check the logging output of your "
+ + "web application and your container for any exceptions!"
+ + "\nIf you did that and find nothing, the mistake might be due to the fact "
+ + "that you use some special web-containers which "
+ + "do not support registering context-listeners via TLD files and "
+ + "a context listener is not setup in your web.xml.\n"
+ + "A typical config looks like this;\n<listener>\n"
+ + " <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>\n"
+ + "</listener>\n";
+ throw new IllegalStateException(message);
+ }
+
+ if (!factoryClassNames.containsKey(factoryName))
+ {
+ throw new IllegalArgumentException("no factory " + factoryName + " configured for this application.");
+ }
+
+ factoryMap = factories.get(classLoader);
+
+ if (factoryMap == null)
+ {
+ factoryMap = new HashMap<String, Object>();
+ factories.put(classLoader, factoryMap);
+ }
+ }
+
+ List beanEntryStorage;
+
+ synchronized (factoryClassNames)
+ {
+ beanEntryStorage = (List)factoryMap.get(INJECTED_BEAN_STORAGE_KEY);
+
+ if (beanEntryStorage == null)
+ {
+ beanEntryStorage = new CopyOnWriteArrayList();
+ factoryMap.put(INJECTED_BEAN_STORAGE_KEY, beanEntryStorage);
+ }
+ }
+
+ List<String> classNames;
+ Object factory;
+ Object injectionProvider;
+ synchronized (factoryClassNames)
+ {
+ factory = factoryMap.get(factoryName);
+ if (factory != null)
+ {
+ return factory;
+ }
+
+ classNames = factoryClassNames.get(factoryName);
+
+ injectionProvider = factoryMap.get(INJECTION_PROVIDER_INSTANCE);
+ }
+
+ if (injectionProvider == null)
+ {
+ injectionProvider = getInjectionProvider();
+ synchronized (factoryClassNames)
+ {
+ factoryMap.put(INJECTION_PROVIDER_INSTANCE, injectionProvider);
+ }
+ }
+
+ // release lock while calling out
+ factory = newFactoryInstance(ABSTRACT_FACTORY_CLASSES.get(factoryName),
+ classNames.iterator(), classLoader, injectionProvider, beanEntryStorage);
+
+ synchronized (factoryClassNames)
+ {
+ // check if someone else already installed the factory
+ if (factoryMap.get(factoryName) == null)
+ {
+ factoryMap.put(factoryName, factory);
+ }
+ }
+
+ return factory;
+ }
+
+ private static Object getInjectionProvider()
+ {
+ try
+ {
+ // Remember the first call in a webapp over FactoryFinder.getFactory(...) comes in the
+ // initialization block, so there is a startup FacesContext active and
+ // also a valid startup ExternalContext. Note after that, we need to cache
+ // the injection provider for the classloader, because in a normal
+ // request there is no active FacesContext in the moment and this call will
+ // surely fail.
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ if (facesContext != null)
+ {
+ Object injectionProviderFactory =
+ _FactoryFinderProviderFactory.INJECTION_PROVIDER_FACTORY_GET_INSTANCE_METHOD
+ .invoke(_FactoryFinderProviderFactory.INJECTION_PROVIDER_CLASS);
+ Object injectionProvider =
+ _FactoryFinderProviderFactory.INJECTION_PROVIDER_FACTORY_GET_INJECTION_PROVIDER_METHOD
+ .invoke(injectionProviderFactory, facesContext.getExternalContext());
+ return injectionProvider;
+ }
+ }
+ catch (Exception e)
+ {
+ }
+ return null;
+ }
+
+ private static void injectAndPostConstruct(Object injectionProvider, Object instance, List injectedBeanStorage)
+ {
+ if (injectionProvider != null)
+ {
+ try
+ {
+ Object creationMetaData = _FactoryFinderProviderFactory.INJECTION_PROVIDER_INJECT_METHOD.invoke(
+ injectionProvider, instance);
+
+ addBeanEntry(instance, creationMetaData, injectedBeanStorage);
+
+ _FactoryFinderProviderFactory.INJECTION_PROVIDER_POST_CONSTRUCT_METHOD.invoke(
+ injectionProvider, instance, creationMetaData);
+ }
+ catch (Exception ex)
+ {
+ throw new FacesException(ex);
+ }
+ }
+ }
+
+ private static void preDestroy(Object injectionProvider, Object beanEntry)
+ {
+ if (injectionProvider != null)
+ {
+ try
+ {
+ _FactoryFinderProviderFactory.INJECTION_PROVIDER_PRE_DESTROY_METHOD.invoke(
+ injectionProvider, getInstance(beanEntry), getCreationMetaData(beanEntry));
+ }
+ catch (Exception ex)
+ {
+ throw new FacesException(ex);
+ }
+ }
+ }
+
+ private static Object getInstance(Object beanEntry)
+ {
+ try
+ {
+ Method getterMethod = getMethod(beanEntry, "getInstance");
+ return getterMethod.invoke(beanEntry);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private static Object getCreationMetaData(Object beanEntry)
+ {
+ try
+ {
+ Method getterMethod = getMethod(beanEntry, "getCreationMetaData");
+ return getterMethod.invoke(beanEntry);
+ }
+ catch (Exception e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private static Method getMethod(Object beanEntry, String methodName) throws NoSuchMethodException
+ {
+ return beanEntry.getClass().getDeclaredMethod(methodName);
+ }
+
+ private static void addBeanEntry(Object instance, Object creationMetaData, List injectedBeanStorage)
+ {
+ try
+ {
+ Class<?> beanEntryClass = _FactoryFinderProviderFactory.classForName(BEAN_ENTRY_CLASS_NAME);
+ Constructor beanEntryConstructor = beanEntryClass.getDeclaredConstructor(Object.class, Object.class);
+
+ Object result = beanEntryConstructor.newInstance(instance, creationMetaData);
+ injectedBeanStorage.add(result);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static Object newFactoryInstance(Class<?> interfaceClass, Iterator<String> classNamesIterator,
+ ClassLoader classLoader, Object injectionProvider,
+ List injectedBeanStorage)
+ {
+ try
+ {
+ Object current = null;
+
+ while (classNamesIterator.hasNext())
+ {
+ String implClassName = classNamesIterator.next();
+ Class<?> implClass = null;
+ try
+ {
+ implClass = classLoader.loadClass(implClassName);
+ }
+ catch (ClassNotFoundException e)
+ {
+ implClass = MYFACES_CLASSLOADER.loadClass(implClassName);
+ }
+
+ // check, if class is of expected interface type
+ if (!interfaceClass.isAssignableFrom(implClass))
+ {
+ throw new IllegalArgumentException("Class " + implClassName + " is no " + interfaceClass.getName());
+ }
+
+ if (current == null)
+ {
+ // nothing to decorate
+ current = implClass.newInstance();
+ injectAndPostConstruct(injectionProvider, current, injectedBeanStorage);
+ }
+ else
+ {
+ // let's check if class supports the decorator pattern
+ try
+ {
+ Constructor<?> delegationConstructor = implClass.getConstructor(new Class[] { interfaceClass });
+ // impl class supports decorator pattern,
+ try
+ {
+ // create new decorator wrapping current
+ current = delegationConstructor.newInstance(new Object[] { current });
+ injectAndPostConstruct(injectionProvider, current, injectedBeanStorage);
+ }
+ catch (InstantiationException e)
+ {
+ throw new FacesException(e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new FacesException(e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new FacesException(e);
+ }
+ }
+ catch (NoSuchMethodException e)
+ {
+ // no decorator pattern support
+ current = implClass.newInstance();
+ injectAndPostConstruct(injectionProvider, current, injectedBeanStorage);
+ }
+ }
+ }
+
+ return current;
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new FacesException(e);
+ }
+ catch (InstantiationException e)
+ {
+ throw new FacesException(e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new FacesException(e);
+ }
+ }
+
+ public static void setFactory(String factoryName, String implName)
+ {
+ if (factoryName == null)
+ {
+ throw new NullPointerException("factoryName may not be null");
+ }
+
+ initializeFactoryFinderProviderFactory();
+
+ if (factoryFinderProviderFactoryInstance == null)
+ {
+ // Do the typical stuff
+ _setFactory(factoryName, implName);
+ }
+ else
+ {
+ try
+ {
+ //Obtain the FactoryFinderProvider instance for this context.
+ Object ffp = _FactoryFinderProviderFactory
+ .FACTORY_FINDER_PROVIDER_FACTORY_GET_FACTORY_FINDER_METHOD
+ .invoke(factoryFinderProviderFactoryInstance, null);
+
+ //Call getFactory method and pass the params
+ _FactoryFinderProviderFactory
+ .FACTORY_FINDER_PROVIDER_SET_FACTORY_METHOD.invoke(ffp, factoryName, implName);
+ }
+ catch (InvocationTargetException e)
+ {
+ Throwable targetException = e.getCause();
+ if (targetException instanceof NullPointerException)
+ {
+ throw (NullPointerException) targetException;
+ }
+ else if (targetException instanceof FacesException)
+ {
+ throw (FacesException) targetException;
+ }
+ else if (targetException instanceof IllegalArgumentException)
+ {
+ throw (IllegalArgumentException) targetException;
+ }
+ else if (targetException == null)
+ {
+ throw new FacesException(e);
+ }
+ else
+ {
+ throw new FacesException(targetException);
+ }
+ }
+ catch (Exception e)
+ {
+ //No Op
+ throw new FacesException(e);
+ }
+
+ }
+ }
+
+ private static void _setFactory(String factoryName, String implName)
+ {
+ checkFactoryName(factoryName);
+
+ ClassLoader classLoader = getClassLoader();
+ Map<String, List<String>> factoryClassNames = null;
+ synchronized (registeredFactoryNames)
+ {
+ Map<String, Object> factories = FactoryFinder.factories.get(classLoader);
+
+ if (factories != null && factories.containsKey(factoryName))
+ {
+ // Javadoc says ... This method has no effect if getFactory() has already been
+ // called looking for a factory for this factoryName.
+ return;
+ }
+
+ factoryClassNames = registeredFactoryNames.get(classLoader);
+
+ if (factoryClassNames == null)
+ {
+ factoryClassNames = new HashMap<String, List<String>>();
+ registeredFactoryNames.put(classLoader, factoryClassNames);
+ }
+ }
+
+ synchronized (factoryClassNames)
+ {
+ List<String> classNameList = factoryClassNames.get(factoryName);
+
+ if (classNameList == null)
+ {
+ classNameList = new ArrayList<String>();
+ factoryClassNames.put(factoryName, classNameList);
+ }
+
+ classNameList.add(implName);
+ }
+ }
+
+ public static void releaseFactories() throws FacesException
+ {
+ initializeFactoryFinderProviderFactory();
+
+ if (factoryFinderProviderFactoryInstance == null)
+ {
+ // Do the typical stuff
+ _releaseFactories();
+ }
+ else
+ {
+ try
+ {
+ //Obtain the FactoryFinderProvider instance for this context.
+ Object ffp = _FactoryFinderProviderFactory
+ .FACTORY_FINDER_PROVIDER_FACTORY_GET_FACTORY_FINDER_METHOD
+ .invoke(factoryFinderProviderFactoryInstance, null);
+
+ //Call getFactory method and pass the params
+ _FactoryFinderProviderFactory.FACTORY_FINDER_PROVIDER_RELEASE_FACTORIES_METHOD.invoke(ffp, null);
+ }
+ catch (InvocationTargetException e)
+ {
+ Throwable targetException = e.getCause();
+ if (targetException instanceof FacesException)
+ {
+ throw (FacesException) targetException;
+ }
+ else if (targetException == null)
+ {
+ throw new FacesException(e);
+ }
+ else
+ {
+ throw new FacesException(targetException);
+ }
+ }
+ catch (Exception e)
+ {
+ //No Op
+ throw new FacesException(e);
+ }
+
+ }
+ }
+
+ private static void _releaseFactories() throws FacesException
+ {
+ ClassLoader classLoader = getClassLoader();
+
+ Map<String, Object> factoryMap;
+ // This code must be synchronized
+ synchronized (registeredFactoryNames)
+ {
+ factoryMap = factories.remove(classLoader);
+
+ // _registeredFactoryNames has as value type Map<String,List> and this must
+ // be cleaned before release (for gc).
+ Map<String, List<String>> factoryClassNames = registeredFactoryNames.get(classLoader);
+ if (factoryClassNames != null)
+ {
+ factoryClassNames.clear();
+ }
+
+ registeredFactoryNames.remove(classLoader);
+ }
+
+ if (factoryMap != null)
+ {
+ Object injectionProvider = factoryMap.remove(INJECTION_PROVIDER_INSTANCE);
+ if (injectionProvider != null)
+ {
+ List injectedBeanStorage = (List)factoryMap.get(INJECTED_BEAN_STORAGE_KEY);
+
+ FacesException firstException = null;
+ for (Object entry : injectedBeanStorage)
+ {
+ try
+ {
+ preDestroy(injectionProvider, entry);
+ }
+ catch (FacesException e)
+ {
+ LOGGER.log(Level.SEVERE, "#preDestroy failed", e);
+
+ if (firstException == null)
+ {
+ firstException = e; //all preDestroy callbacks need to get invoked
+ }
+ }
+ }
+ injectedBeanStorage.clear();
+
+ if (firstException != null)
+ {
+ throw firstException;
+ }
+ }
+ }
+ }
+
+ private static void checkFactoryName(String factoryName)
+ {
+ if (!VALID_FACTORY_NAMES.contains(factoryName))
+ {
+ throw new IllegalArgumentException("factoryName '" + factoryName + "'");
+ }
+ }
+
+ private static ClassLoader getClassLoader()
+ {
+ try
+ {
+ ClassLoader classLoader = null;
+ if (System.getSecurityManager() != null)
+ {
+ classLoader = (ClassLoader) AccessController.doPrivileged(new java.security.PrivilegedExceptionAction()
+ {
+ public Object run()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+ else
+ {
+ classLoader = Thread.currentThread().getContextClassLoader();
+ }
+
+ if (classLoader == null)
+ {
+ throw new FacesException("web application class loader cannot be identified", null);
+ }
+ return classLoader;
+ }
+ catch (Exception e)
+ {
+ throw new FacesException("web application class loader cannot be identified", e);
+ }
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/_FactoryFinderProviderFactory.java b/api/src/main/java/jakarta/faces/_FactoryFinderProviderFactory.java
new file mode 100644
index 0000000..6e4856d
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/_FactoryFinderProviderFactory.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces;
+
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import jakarta.faces.context.ExternalContext;
+
+/**
+ * Provide utility methods used by FactoryFinder class to lookup for SPI interface FactoryFinderProvider.
+ *
+ * @since 2.0.5
+ */
+class _FactoryFinderProviderFactory
+{
+
+ public static final String FACTORY_FINDER_PROVIDER_FACTORY_CLASS_NAME = "org.apache.myfaces.spi" +
+ ".FactoryFinderProviderFactory";
+
+ public static final String FACTORY_FINDER_PROVIDER_CLASS_NAME = "org.apache.myfaces.spi.FactoryFinderProvider";
+
+ public static final String INJECTION_PROVIDER_FACTORY_CLASS_NAME =
+ "org.apache.myfaces.spi.InjectionProviderFactory";
+
+ public static final String INJECTION_PROVIDER_CLASS_NAME = "org.apache.myfaces.spi.InjectionProvider";
+
+ public static final Class<?> FACTORY_FINDER_PROVIDER_FACTORY_CLASS;
+
+ public static final Method FACTORY_FINDER_PROVIDER_GET_INSTANCE_METHOD;
+
+ public static final Method FACTORY_FINDER_PROVIDER_FACTORY_GET_FACTORY_FINDER_METHOD;
+ public static final Class<?> FACTORY_FINDER_PROVIDER_CLASS;
+ public static final Method FACTORY_FINDER_PROVIDER_GET_FACTORY_METHOD;
+ public static final Method FACTORY_FINDER_PROVIDER_SET_FACTORY_METHOD;
+ public static final Method FACTORY_FINDER_PROVIDER_RELEASE_FACTORIES_METHOD;
+
+ public static final Class<?> INJECTION_PROVIDER_FACTORY_CLASS;
+ public static final Method INJECTION_PROVIDER_FACTORY_GET_INSTANCE_METHOD;
+ public static final Method INJECTION_PROVIDER_FACTORY_GET_INJECTION_PROVIDER_METHOD;
+ public static final Class<?> INJECTION_PROVIDER_CLASS;
+ public static final Method INJECTION_PROVIDER_INJECT_METHOD;
+ public static final Method INJECTION_PROVIDER_POST_CONSTRUCT_METHOD;
+ public static final Method INJECTION_PROVIDER_PRE_DESTROY_METHOD;
+
+ static
+ {
+ Class factoryFinderFactoryClass = null;
+ Method factoryFinderproviderFactoryGetMethod = null;
+ Method factoryFinderproviderFactoryGetFactoryFinderMethod = null;
+ Class<?> factoryFinderProviderClass = null;
+
+ Method factoryFinderProviderGetFactoryMethod = null;
+ Method factoryFinderProviderSetFactoryMethod = null;
+ Method factoryFinderProviderReleaseFactoriesMethod = null;
+
+ Class injectionProviderFactoryClass = null;
+ Method injectionProviderFactoryGetInstanceMethod = null;
+ Method injectionProviderFactoryGetInjectionProviderMethod = null;
+ Class injectionProviderClass = null;
+ Method injectionProviderInjectMethod = null;
+ Method injectionProviderPostConstructMethod = null;
+ Method injectionProviderPreDestroyMethod = null;
+
+ try
+ {
+ factoryFinderFactoryClass = classForName(FACTORY_FINDER_PROVIDER_FACTORY_CLASS_NAME);
+ if (factoryFinderFactoryClass != null)
+ {
+ factoryFinderproviderFactoryGetMethod = factoryFinderFactoryClass.getMethod
+ ("getInstance", null);
+ factoryFinderproviderFactoryGetFactoryFinderMethod = factoryFinderFactoryClass
+ .getMethod("getFactoryFinderProvider", null);
+ }
+
+ factoryFinderProviderClass = classForName(FACTORY_FINDER_PROVIDER_CLASS_NAME);
+ if (factoryFinderProviderClass != null)
+ {
+ factoryFinderProviderGetFactoryMethod = factoryFinderProviderClass.getMethod("getFactory",
+ new Class[]{String.class});
+ factoryFinderProviderSetFactoryMethod = factoryFinderProviderClass.getMethod("setFactory",
+ new Class[]{String.class, String.class});
+ factoryFinderProviderReleaseFactoriesMethod = factoryFinderProviderClass.getMethod
+ ("releaseFactories", null);
+ }
+
+ injectionProviderFactoryClass = classForName(INJECTION_PROVIDER_FACTORY_CLASS_NAME);
+
+ if (injectionProviderFactoryClass != null)
+ {
+ injectionProviderFactoryGetInstanceMethod = injectionProviderFactoryClass.
+ getMethod("getInjectionProviderFactory", null);
+ injectionProviderFactoryGetInjectionProviderMethod = injectionProviderFactoryClass.
+ getMethod("getInjectionProvider", ExternalContext.class);
+ }
+
+ injectionProviderClass = classForName(INJECTION_PROVIDER_CLASS_NAME);
+
+ if (injectionProviderClass != null)
+ {
+ injectionProviderInjectMethod = injectionProviderClass.
+ getMethod("inject", Object.class);
+ injectionProviderPostConstructMethod = injectionProviderClass.
+ getMethod("postConstruct", Object.class, Object.class);
+ injectionProviderPreDestroyMethod = injectionProviderClass.
+ getMethod("preDestroy", Object.class, Object.class);
+ }
+ }
+ catch (Exception e)
+ {
+ // no op
+ }
+
+ FACTORY_FINDER_PROVIDER_FACTORY_CLASS = factoryFinderFactoryClass;
+ FACTORY_FINDER_PROVIDER_GET_INSTANCE_METHOD = factoryFinderproviderFactoryGetMethod;
+ FACTORY_FINDER_PROVIDER_FACTORY_GET_FACTORY_FINDER_METHOD = factoryFinderproviderFactoryGetFactoryFinderMethod;
+ FACTORY_FINDER_PROVIDER_CLASS = factoryFinderProviderClass;
+
+ FACTORY_FINDER_PROVIDER_GET_FACTORY_METHOD = factoryFinderProviderGetFactoryMethod;
+ FACTORY_FINDER_PROVIDER_SET_FACTORY_METHOD = factoryFinderProviderSetFactoryMethod;
+ FACTORY_FINDER_PROVIDER_RELEASE_FACTORIES_METHOD = factoryFinderProviderReleaseFactoriesMethod;
+
+ INJECTION_PROVIDER_FACTORY_CLASS = injectionProviderFactoryClass;
+ INJECTION_PROVIDER_FACTORY_GET_INSTANCE_METHOD = injectionProviderFactoryGetInstanceMethod;
+ INJECTION_PROVIDER_FACTORY_GET_INJECTION_PROVIDER_METHOD = injectionProviderFactoryGetInjectionProviderMethod;
+ INJECTION_PROVIDER_CLASS = injectionProviderClass;
+ INJECTION_PROVIDER_INJECT_METHOD = injectionProviderInjectMethod;
+ INJECTION_PROVIDER_POST_CONSTRUCT_METHOD = injectionProviderPostConstructMethod;
+ INJECTION_PROVIDER_PRE_DESTROY_METHOD = injectionProviderPreDestroyMethod;
+ }
+
+ public static Object getInstance()
+ {
+ if (FACTORY_FINDER_PROVIDER_GET_INSTANCE_METHOD != null)
+ {
+ try
+ {
+ return FACTORY_FINDER_PROVIDER_GET_INSTANCE_METHOD.invoke(FACTORY_FINDER_PROVIDER_FACTORY_CLASS, null);
+ }
+ catch (Exception e)
+ {
+ //No op
+ Logger log = Logger.getLogger(_FactoryFinderProviderFactory.class.getName());
+ if (log.isLoggable(Level.WARNING))
+ {
+ log.log(Level.WARNING, "Cannot retrieve current FactoryFinder instance from " +
+ "FactoryFinderProviderFactory." +
+ " Default strategy using thread context class loader will be used.", e);
+ }
+ }
+ }
+ return null;
+ }
+
+ // ~ Methods Copied from _ClassUtils
+ // ------------------------------------------------------------------------------------
+
+ /**
+ * Tries a Class.loadClass with the context class loader of the current thread first and automatically falls back
+ * to
+ * the ClassUtils class loader (i.e. the loader of the myfaces.jar lib) if necessary.
+ *
+ * @param type fully qualified name of a non-primitive non-array class
+ * @return the corresponding Class
+ * @throws NullPointerException if type is null
+ * @throws ClassNotFoundException
+ */
+ public static Class<?> classForName(String type) throws ClassNotFoundException
+ {
+ if (type == null)
+ {
+ throw new NullPointerException("type");
+ }
+ try
+ {
+ // Try WebApp ClassLoader first
+ return Class.forName(type, false, // do not initialize for faster startup
+ getContextClassLoader());
+ }
+ catch (ClassNotFoundException ignore)
+ {
+ // fallback: Try ClassLoader for ClassUtils (i.e. the myfaces.jar lib)
+ return Class.forName(type, false, // do not initialize for faster startup
+ _FactoryFinderProviderFactory.class.getClassLoader());
+ }
+ }
+
+ /**
+ * Gets the ClassLoader associated with the current thread. Returns the class loader associated with the specified
+ * default object if no context loader is associated with the current thread.
+ *
+ * @return ClassLoader
+ */
+ protected static ClassLoader getContextClassLoader()
+ {
+ if (System.getSecurityManager() != null)
+ {
+ try
+ {
+ Object cl = AccessController.doPrivileged(new PrivilegedExceptionAction()
+ {
+ public Object run() throws PrivilegedActionException
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ return (ClassLoader) cl;
+ }
+ catch (PrivilegedActionException pae)
+ {
+ throw new FacesException(pae);
+ }
+ }
+ else
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/ApplicationMap.java b/api/src/main/java/jakarta/faces/annotation/ApplicationMap.java
new file mode 100644
index 0000000..634ac98
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/ApplicationMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface ApplicationMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/FacesConfig.java b/api/src/main/java/jakarta/faces/annotation/FacesConfig.java
new file mode 100644
index 0000000..729f97c
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/FacesConfig.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Target(value=ElementType.TYPE)
+@Retention(value=RetentionPolicy.RUNTIME)
+public @interface FacesConfig
+{
+
+ @Nonbinding Version version() default Version.JSF_2_3;
+
+ public static enum Version
+ {
+ JSF_2_3
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/FlowMap.java b/api/src/main/java/jakarta/faces/annotation/FlowMap.java
new file mode 100644
index 0000000..464534c
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/FlowMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface FlowMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/HeaderMap.java b/api/src/main/java/jakarta/faces/annotation/HeaderMap.java
new file mode 100644
index 0000000..486b36c
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/HeaderMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface HeaderMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/HeaderValuesMap.java b/api/src/main/java/jakarta/faces/annotation/HeaderValuesMap.java
new file mode 100644
index 0000000..9ddfb21
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/HeaderValuesMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface HeaderValuesMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/InitParameterMap.java b/api/src/main/java/jakarta/faces/annotation/InitParameterMap.java
new file mode 100644
index 0000000..1789117
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/InitParameterMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface InitParameterMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/ManagedProperty.java b/api/src/main/java/jakarta/faces/annotation/ManagedProperty.java
new file mode 100644
index 0000000..0a3c4ab
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/ManagedProperty.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Target(value=ElementType.FIELD)
+@Retention(value=RetentionPolicy.RUNTIME)
+public @interface ManagedProperty
+{
+ public String value();
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/RequestCookieMap.java b/api/src/main/java/jakarta/faces/annotation/RequestCookieMap.java
new file mode 100644
index 0000000..2890e4a
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/RequestCookieMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface RequestCookieMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/RequestMap.java b/api/src/main/java/jakarta/faces/annotation/RequestMap.java
new file mode 100644
index 0000000..5de39f0
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/RequestMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface RequestMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/RequestParameterMap.java b/api/src/main/java/jakarta/faces/annotation/RequestParameterMap.java
new file mode 100644
index 0000000..2a1291c
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/RequestParameterMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface RequestParameterMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/RequestParameterValuesMap.java b/api/src/main/java/jakarta/faces/annotation/RequestParameterValuesMap.java
new file mode 100644
index 0000000..17116c3
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/RequestParameterValuesMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface RequestParameterValuesMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/SessionMap.java b/api/src/main/java/jakarta/faces/annotation/SessionMap.java
new file mode 100644
index 0000000..4038700
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/SessionMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface SessionMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/annotation/ViewMap.java b/api/src/main/java/jakarta/faces/annotation/ViewMap.java
new file mode 100644
index 0000000..830559c
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/annotation/ViewMap.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Qualifier
+@Retention(value=RUNTIME)
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
+public @interface ViewMap
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/Application.java b/api/src/main/java/jakarta/faces/application/Application.java
new file mode 100644
index 0000000..0da320f
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/Application.java
@@ -0,0 +1,1311 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import jakarta.faces.component.behavior.Behavior;
+import jakarta.faces.component.search.SearchExpressionHandler;
+import jakarta.faces.component.search.SearchKeywordResolver;
+import jakarta.faces.event.ActionListener;
+import jakarta.faces.event.SystemEvent;
+import jakarta.faces.event.SystemEventListener;
+import jakarta.faces.validator.Validator;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import javax.el.ELContextListener;
+import javax.el.ELException;
+import javax.el.ELResolver;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
+import jakarta.faces.FacesException;
+import jakarta.faces.component.UIComponent;
+import jakarta.faces.context.ExternalContext;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.convert.Converter;
+import jakarta.faces.el.MethodBinding;
+import jakarta.faces.el.PropertyResolver;
+import jakarta.faces.el.ReferenceSyntaxException;
+import jakarta.faces.el.ValueBinding;
+import jakarta.faces.el.VariableResolver;
+import jakarta.faces.flow.FlowHandler;
+
+/**
+ * <p>
+ * Application represents a per-web-application singleton object where applications based on JavaServer Faces (or
+ * implementations wishing to provide extended functionality) can register application-wide singletons that provide
+ * functionality required by JavaServer Faces. Default implementations of each object are provided for cases where the
+ * application does not choose to customize the behavior.
+ * </p>
+ *
+ * <p>
+ * The instance of {@link Application} is created by calling the <code>getApplication()</code> method of
+ * {@link ApplicationFactory}. Because this instance is shared, it must be implemented in a thread-safe manner.
+ * </p>
+ *
+ * Holds webapp-wide resources for a JSF application. There is a single one of these for a web application, accessable
+ * via
+ *
+ * <pre>
+ * FacesContext.getCurrentInstance().getApplication()
+ * </pre>
+ *
+ * In particular, this provides a factory for UIComponent objects. It also provides convenience methods for creating
+ * ValueBinding objects.
+ *
+ * See Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+@SuppressWarnings("deprecation")
+public abstract class Application
+{
+
+ /**
+ * Retrieve the current Myfaces Application Instance, lookup
+ * on the application map. All methods introduced on jsf 1.2
+ * for Application interface should thrown by default
+ * UnsupportedOperationException, but the ri scan and find the
+ * original Application impl, and redirect the call to that
+ * method instead throwing it, allowing application implementations
+ * created before jsf 1.2 continue working.
+ *
+ * Note: every method, which uses getMyfacesApplicationInstance() to
+ * delegate itself to the current ApplicationImpl MUST be
+ * overriden by the current ApplicationImpl to prevent infinite loops.
+ */
+ private Application getMyfacesApplicationInstance()
+ {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ if (facesContext != null)
+ {
+ ExternalContext externalContext = facesContext.getExternalContext();
+ if (externalContext != null)
+ {
+ return (Application) externalContext.getApplicationMap().get(
+ "org.apache.myfaces.application.ApplicationImpl");
+ }
+ }
+ return null;
+ }
+
+ private Application getMyfacesApplicationInstance(FacesContext facesContext)
+ {
+ if (facesContext != null)
+ {
+ ExternalContext externalContext = facesContext.getExternalContext();
+ if (externalContext != null)
+ {
+ return (Application) externalContext.getApplicationMap().get(
+ "org.apache.myfaces.application.ApplicationImpl");
+ }
+ }
+ return null;
+ }
+
+ // The concrete methods throwing UnsupportedOperationExceptiom were added for JSF 1.2.
+ // They supply default to allows old Application implementations to still work.
+
+ /**
+ * @since 2.0
+ *
+ * FIXME: Notify EG, this should not be abstract and throw UnsupportedOperationException
+ *
+ * @param behaviorId
+ * @param behaviorClass
+ */
+ public void addBehavior(String behaviorId, String behaviorClass)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.addBehavior(behaviorId, behaviorClass);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Define a new mapping from a logical "component type" to an actual java class name. This controls what type is
+ * created when method createComponent of this class is called.
+ * <p>
+ * Param componentClass must be the fully-qualified class name of some class extending the UIComponent class. The
+ * class must have a default constructor, as instances of it will be created using Class.newInstance.
+ * <p>
+ * It is permitted to override a previously defined mapping, ie to call this method multiple times with the same
+ * componentType string. The createComponent method will simply use the last defined mapping.
+ */
+ /**
+ * Register a new mapping of component type to the name of the corresponding {@link UIComponent} class. This allows
+ * subsequent calls to <code>createComponent()</code> to serve as a factory for {@link UIComponent} instances.
+ *
+ * @param componentType
+ * - The component type to be registered
+ * @param componentClass
+ * - The fully qualified class name of the corresponding {@link UIComponent} implementation
+ *
+ * @throws NullPointerException
+ * if <code>componentType</code> or <code>componentClass</code> is <code>null</code>
+ */
+ public abstract void addComponent(String componentType, String componentClass);
+
+ /**
+ * Register a new converter class that is capable of performing conversions for the specified target class.
+ *
+ * @param targetClass
+ * - The class for which this converter is registered
+ * @param converterClass
+ * - The fully qualified class name of the corresponding {@link Converter} implementation
+ *
+ * @throws NullPointerException
+ * if <code>targetClass</code> or <code>converterClass</code> is <code>null</code>
+ */
+ public abstract void addConverter(Class<?> targetClass, String converterClass);
+
+ /**
+ * Register a new mapping of converter id to the name of the corresponding {@link Converter} class. This allows
+ * subsequent calls to createConverter() to serve as a factory for {@link Converter} instances.
+ *
+ * @param converterId
+ * - The converterId to be registered
+ * @param converterClass
+ * - The fully qualified class name of the corresponding {@link Converter} implementation
+ *
+ * @throws NullPointerException
+ * if <code>componentType</code> or <code>componentClass</code> is <code>null</code>
+ */
+ public abstract void addConverter(String converterId, String converterClass);
+
+ /**
+ *
+ * @since 2.0
+ * @param validatorId
+ */
+ public void addDefaultValidatorId(String validatorId)
+ {
+ }
+
+ /**
+ * <p>
+ * Provide a way for Faces applications to register an <code>ELContextListener</code> that will be notified on
+ * creation of <code>ELContext</code> instances.
+ * <p>
+ *
+ * <p>
+ * An implementation is provided that throws <code>UnsupportedOperationException</code> so that users that decorate
+ * the <code>Application</code> continue to work.
+ * </p>
+ *
+ * @since 1.2
+ */
+ public void addELContextListener(ELContextListener listener)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.addELContextListener(listener);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Cause an the argument <code>resolver</code> to be added to the resolver chain as specified in section 5.5.1 of
+ * the JavaServer Faces Specification.
+ * </p>
+ *
+ * <p>
+ * It is not possible to remove an <code>ELResolver</code> registered with this method, once it has been registered.
+ * </p>
+ *
+ * <p>
+ * It is illegal to register an ELResolver after the application has received any requests from the client. If an
+ * attempt is made to register a listener after that time, an IllegalStateException must be thrown. This restriction
+ * is in place to allow the JSP container to optimize for the common case where no additional
+ * <code>ELResolvers</code> are in the chain, aside from the standard ones. It is permissible to add
+ * <code>ELResolvers</code> before or after initialization to a CompositeELResolver that is already in the chain.
+ * <p>
+ *
+ * <p>
+ * The default implementation throws <code>UnsupportedOperationException</code> and is provided for the sole purpose
+ * of not breaking existing applications that extend {@link Application}.
+ * </p>
+ *
+ * @since 1.2
+ */
+ public void addELResolver(ELResolver resolver)
+ {
+ // The following concrete methods were added for JSF 1.2. They supply default
+ // implementations that throw UnsupportedOperationException.
+ // This allows old Application implementations to still work.
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.addELResolver(resolver);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *Register a new mapping of validator id to the name of the corresponding <code>Validator</code> class. This allows
+ * subsequent calls to <code>createValidator()</code> to serve as a factory for <code>Validator</code> instances.
+ *
+ *@param validatorId The validator id to be registered
+ *@param validatorClass The fully qualified class name of the corresponding Validator implementation
+ *
+ *@throws NullPointerException
+ * if <code>validatorId</code> or <code>validatorClass</code> is <code>null</code>
+ */
+ public abstract void addValidator(String validatorId, String validatorClass);
+
+ /**
+ *
+ * @param behaviorId
+ * @return
+ * @throws FacesException
+ * @since 2.0
+ *
+ * FIXME: Notify EG, this should not be abstract and throw UnsupportedOperationException
+ */
+ public Behavior createBehavior(String behaviorId) throws FacesException
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.createBehavior(behaviorId);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * ???
+ *
+ * @param context
+ * @param componentResource
+ * @return
+ *
+ * @since 2.0
+ */
+ public UIComponent createComponent(FacesContext context, Resource componentResource)
+ {
+ Application application = getMyfacesApplicationInstance(context);
+ if (application != null)
+ {
+ return application.createComponent(context, componentResource);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *
+ * @param context
+ * @param componentType
+ * @param rendererType
+ * @return
+ *
+ * @since 2.0
+ */
+ public UIComponent createComponent(FacesContext context, String componentType, String rendererType)
+ {
+ Application application = getMyfacesApplicationInstance(context);
+ if (application != null)
+ {
+ return application.createComponent(context, componentType, rendererType);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Create a new UIComponent subclass, using the mappings defined by previous calls to the addComponent method of
+ * this class.
+ * </p>
+ *
+ * @throws FacesException
+ * if there is no mapping defined for the specified componentType, or if an instance of the specified
+ * type could not be created for any reason.
+ */
+ public abstract UIComponent createComponent(String componentType) throws FacesException;
+
+ /**
+ * <p>
+ * Create an object which has an associating "binding" expression tying the component to a user property.
+ * </p>
+ *
+ * <p>
+ * First the specified value-binding is evaluated; if it returns a non-null value then the component
+ * "already exists" and so the resulting value is simply returned.
+ * </p>
+ *
+ * <p>
+ * Otherwise a new UIComponent instance is created using the specified componentType, and the new object stored via
+ * the provided value-binding before being returned.
+ * </p>
+ *
+ * @deprecated
+ */
+ public abstract UIComponent createComponent(ValueBinding componentBinding, FacesContext context,
+ String componentType) throws FacesException;
+
+ /**
+ * <p>
+ * Call the <code>getValue()</code> method on the specified <code>ValueExpression</code>. If it returns a
+ * <code>{@link UIComponent}</code> instance, return it as the value of this method. If it does not, instantiate a
+ * new <code>{@link UIComponent}</code> instance of the specified component type, pass the new component to the
+ * <code>setValue()</code> method of the specified <code>ValueExpression</code>, and return it.
+ * </p>
+ *
+ * @param componentExpression
+ * - <code>ValueExpression</code> representing a component value expression (typically specified by the
+ * <code>component</code> attribute of a custom tag)
+ * @param context
+ * - {@link FacesContext} for the current request
+ * @param componentType
+ * - Component type to create if the ValueExpression does not return a component instance
+ *
+ * @throws FacesException
+ * if a <code>{@link UIComponent}</code> cannot be created
+ * @throws NullPointerException
+ * if any parameter is null
+ * <p>
+ * A default implementation is provided that throws <code>UnsupportedOperationException</code> so that
+ * users that decorate <code>Application</code> can continue to function
+ * </p>
+ *
+ * @since 1.2
+ */
+ public UIComponent createComponent(ValueExpression componentExpression, FacesContext context, String componentType)
+ throws FacesException
+ {
+ Application application = getMyfacesApplicationInstance(context);
+ if (application != null)
+ {
+ return application.createComponent(componentExpression, context, componentType);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *
+ * @param componentExpression
+ * @param context
+ * @param componentType
+ * @param rendererType
+ * @return
+ *
+ * @since 2.0
+ */
+ public UIComponent createComponent(ValueExpression componentExpression, FacesContext context, String componentType,
+ String rendererType)
+ {
+ Application application = getMyfacesApplicationInstance(context);
+ if (application != null)
+ {
+ return application.createComponent(componentExpression, context, componentType, rendererType);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Instantiate and return a new <code>{@link Converter}</code> instance of the class that has registered itself as
+ * capable of performing conversions for objects of the specified type. If no such <code>{@link Converter}</code>
+ * class can be identified, return null.
+ * </p>
+ *
+ * <p>
+ * To locate an appropriate <code>{@link Converter}</code> class, the following algorithm is performed, stopping as
+ * soon as an appropriate <code>{@link Converter}</code> class is found: Locate a <code>{@link Converter}</code>
+ * registered for the target class itself. Locate a <code>{@link Converter}</code> registered for interfaces that
+ * are implemented by the target class (directly or indirectly). Locate a <code>{@link Converter}</code> registered
+ * for the superclass (if any) of the target class, recursively working up the inheritance hierarchy.
+ * </p>
+ *
+ * <p>
+ * If the <code>{@link Converter}</code> has a single argument constructor that accepts a Class, instantiate the
+ * <code>{@link Converter}</code> using that constructor, passing the argument <code>targetClass</code> as
+ * the sole argument. Otherwise, simply use the zero-argument constructor.
+ *
+ * @param targetClass
+ * - Target class for which to return a <code>{@link Converter}</code>
+ *
+ * @throws FacesException
+ * if the <code>{@link Converter}</code> cannot be created
+ * @throws NullPointerException
+ * if <code>targetClass</code> is <code>null</code>
+ *
+ */
+ public abstract Converter createConverter(Class<?> targetClass);
+
+ /**
+ * Instantiate and return a new <code>{@link Converter}</code> instance of the class specified by a previous call to
+ * <code>addConverter()</code> for the specified converter id. If there is no such registration for this converter
+ * id, return <code>null</code>.
+ *
+ * @param converterId
+ * - The converter id for which to create and return a new <code>{@link Converter}</code> instance
+ *
+ * @throws FacesException
+ * if the <code>{@link Converter}</code> cannot be created
+ * @throws NullPointerException
+ * if converterId is <code>null</code>
+ */
+ public abstract Converter createConverter(String converterId);
+
+ /**
+ * Create an object which can be used to invoke an arbitrary method via an EL expression at a later time. This is
+ * similar to createValueBinding except that it can invoke an arbitrary method (with parameters) rather than just
+ * get/set a javabean property.
+ * <p>
+ * This is used to invoke ActionListener method, and ValueChangeListener methods.
+ *
+ * @deprecated
+ */
+ public abstract MethodBinding createMethodBinding(String ref, Class<?>[] params) throws ReferenceSyntaxException;
+
+ /**
+ * Instantiate and return a new <code>{@link Validator}</code> instance of the class specified by a previous call to
+ * <code>addValidator()</code> for the specified validator id.
+ *
+ * @param validatorId The <code>{@link Validator}</code> id for which to create and return a new
+ * Validator instance
+ *
+ * @throws FacesException
+ * if a <code>{@link Validator}</code> of the specified id cannot be created
+ * @throws NullPointerException
+ * if validatorId is <code>null</code>
+ */
+ public abstract Validator createValidator(String validatorId) throws FacesException;
+
+ /**
+ * <p>
+ * Create an object which can be used to invoke an arbitrary method via an EL expression at a later time. This is
+ * similar to createValueBinding except that it can invoke an arbitrary method (with parameters) rather than just
+ * get/set a javabean property.
+ * </p>
+ * This is used to invoke ActionListener method, and ValueChangeListener methods.
+ *
+ * @deprecated
+ */
+ public abstract ValueBinding createValueBinding(String ref) throws ReferenceSyntaxException;
+
+ /**
+ * <p>
+ * Get a value by evaluating an expression.
+ * </p>
+ *
+ * <p>
+ * Call <code>{@link #getExpressionFactory()}</code> then call
+ * <code>ExpressionFactory.createValueExpression(javax.el.ELContext, java.lang.String, java.lang.Class)</code>
+ * passing the argument <code>expression</code> and <code>expectedType</code>. Call
+ * <code>{@link FacesContext#getELContext()}</code> and pass it to
+ * <code>ValueExpression.getValue(javax.el.ELContext)</code>, returning the result.
+ * </p>
+ *
+ * <p>
+ * An implementation is provided that throws <code>UnsupportedOperationException</code> so that users that decorate
+ * the <code>Application</code> continue to work.
+ * <p>
+ *
+ * @throws javax.el.ELException
+ */
+ public <T> T evaluateExpressionGet(FacesContext context, String expression, Class<? extends T> expectedType)
+ throws ELException
+ {
+ Application application = getMyfacesApplicationInstance(context);
+ if (application != null)
+ {
+ return application.evaluateExpressionGet(context, expression, expectedType);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Return the default <code>ActionListener</code> to be registered for all <code>ActionSource</code> components
+ * in this appication. If not explicitly set, a default implementation must be provided that performs the
+ * following functions:
+ * </p>
+ * <ul>
+ * <li>The <code>processAction()</code> method must first call <code>FacesContext.renderResponse()</code>in order to
+ * bypass any intervening lifecycle phases, once the method returns.</li>
+ *
+ * <li>The <code>processAction()</code> method must next determine the logical
+ * outcome of this event, as follows:</li>
+ *
+ * <li>If the originating component has a non-<code>null action</code> property, retrieve the <code>
+ * MethodBinding</code> from the property, and call <code>invoke()</code>
+ * on it. Convert the returned value (if any) to a String, and use it as the logical outcome.</li>
+ * <li>Otherwise, the logical outcome is null.</li>
+ * <li>The <code>processAction()</code> method must finally retrieve the <code>NavigationHandler</code> instance
+ * for this application and call
+ * code>NavigationHandler.handleNavigation(jakarta.faces.context.FacesContext,
+ * java.lang.String, java.lang.String)</code> passing:</li>
+ * <li>the {@link FacesContext} for the current request</li>
+ * <li>If there is a <code>MethodBinding</code> instance for the <code>action</code> property of this component, the
+ * result of calling {@link MethodBinding#getExpressionString()} on it, null otherwise</li>
+ * <li>the logical outcome as determined above</li>
+ * </ul>
+ * <p>
+ * Note that the specification for the default <code>ActionListener</code> contiues to call for the use of a
+ * deprecated property (<code>action</code>) and class (<code>MethodBinding</code>). Unfortunately, this is
+ * necessary because the default ActionListener must continue to work with components that do not implement
+ * {@link jakarta.faces.component.ActionSource2}, and only implement {@link jakarta.faces.component.ActionSource}.
+ */
+ public abstract ActionListener getActionListener();
+
+ /**
+ *
+ * @return
+ *
+ * @since 2.0
+ *
+ * FIXME: Notify EG, this should not be abstract and throw UnsupportedOperationException
+ */
+ public Iterator<String> getBehaviorIds()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getBehaviorIds();
+ }
+ // It is better to return an empty iterator,
+ // to keep compatiblity with previous jsf 2.0 Application
+ // instances
+ return Collections.EMPTY_LIST.iterator();
+ }
+
+ /**
+ * Return an <code>Iterator</code> over the set of currently defined component types for this
+ * <code>Application</code>.
+ */
+ public abstract Iterator<String> getComponentTypes();
+
+ /**
+ * Return an <code>Iterator</code> over the set of currently registered converter ids for this
+ * <code>Application</code>
+ *
+ * @return
+ */
+ public abstract Iterator<String> getConverterIds();
+
+ /**
+ *Return an <code>Iterator</code> over the set of <code>Class</code> instances for which <code>{@link Converter}
+ * </code> <code>classes</code>have been explicitly registered.
+ *
+ * @return
+ */
+ public abstract Iterator<Class<?>> getConverterTypes();
+
+ /**
+ *Return the default <code>Locale</code> for this application. If not explicitly set, <code>null</code> is
+ * returned.
+ *
+ * @return
+ */
+ public abstract Locale getDefaultLocale();
+
+ /**
+ * Return the <code>renderKitId</code> to be used for rendering this application. If not explicitly set,
+ * <code>null</code> is returned.
+ *
+ * @return
+ */
+ public abstract String getDefaultRenderKitId();
+
+ /**
+ *
+ * @return
+ *
+ * @since 2.0
+ */
+ public Map<String, String> getDefaultValidatorInfo()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getDefaultValidatorInfo();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * If no calls have been made to <code>addELContextListener(javax.el.ELContextListener)</code>, this method must
+ * return an empty array
+ * <p>
+ * .
+ *
+ * <p>
+ * Otherwise, return an array representing the list of listeners added by calls to
+ * <code>addELContextListener(javax.el.ELContextListener)</code>.
+ * <p>
+ *
+ * <p>
+ * An <code>implementation</code> is provided that throws UnsupportedOperationException so that users that decorate
+ * the <code>Application</code> continue to work.
+ * </p>
+ *
+ * @since 1.2
+ */
+ public ELContextListener[] getELContextListeners()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getELContextListeners();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Return the singleton <code>ELResolver</code> instance to be used for all EL resolution. This is actually an
+ * instance of <code>CompositeELResolver</code> that must contain the following ELResolver instances in the
+ * following order:
+ * <ul>
+ * <li><code>ELResolver</code> instances declared using the <el-resolver> element in the application
+ * configuration resources.</li>
+ *
+ * <li>An <code> implementation</code> that wraps the head of the legacy VariableResolver chain, as per section
+ * <code> VariableResolver ChainWrapper</code> in Chapter 5 in the spec document.</li>
+ *
+ * <li>An <code>implementation</code> that wraps the head of the legacy PropertyResolver chain, as per section
+ * <code>PropertyResolver ChainWrapper</code> in Chapter 5 in the spec document.</li>
+ *
+ * <li>Any <code>ELResolver</code> instances added by calls to
+ * <code>{@link #addELResolver(javax.el.ELResolver)}</code>.</li>
+ *
+ * <li>The default implementation throws <code>UnsupportedOperationException</code> and is provided for the sole
+ * purpose of not breaking existing applications that extend <code>{@link Application}</code>.</li>
+ * </ul>
+ *
+ * @since 1.2
+ */
+ public ELResolver getELResolver()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getELResolver();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Return the <code>ExpressionFactory</code> instance for this application. This instance is used by the convenience
+ * method <code>{@link #evaluateExpressionGet(FacesContext, java.lang.String, java.lang.Class)}.
+ * </code>
+ * </p>
+ *
+ * <p>
+ * The implementation must return the <code>ExpressionFactory</code> from the JSP container by calling <code>
+ * JspFactory.getDefaultFactory().getJspApplicationContext(servletContext).getExpressionFactory()</code>.
+ * </p>
+ *
+ * <p>
+ * An implementation is provided that throws <code>UnsupportedOperationException</code> so that users that decorate
+ * the <code>Application</code> continue to work.
+ * </p>
+ *
+ * @since 1.2
+ * @return
+ */
+ public ExpressionFactory getExpressionFactory()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getExpressionFactory();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Return the fully qualified class name of the <code>ResourceBundle</code> to be used for JavaServer Faces messages
+ * for this application. If not explicitly set, <code>null</code> is returned.
+ */
+ public abstract String getMessageBundle();
+
+ /**
+ *Return the <code>{@link NavigationHandler}</code> instance that will be passed the outcome returned by any
+ * invoked application action for this web application. If not explicitly set, a default implementation must be
+ * provided that performs the functions described in the <code>{@link NavigationHandler}</code> class description.
+ */
+ public abstract NavigationHandler getNavigationHandler();
+
+ /**
+ * <p>
+ * Return the project stage for the currently running application instance. The default value is <code>
+ * {@link ProjectStage#Production}</code>
+ * </p>
+ *
+ * <p>
+ * The implementation of this method must perform the following algorithm or an equivalent with the same end result
+ * to determine the value to return.
+ * </p>
+ *
+ * <ul>
+ * <li>If the value has already been determined by a previous call to this method, simply return that value.</li>
+ * <li>Look for a <code>JNDI</code> environment entry under the key given by the value of
+ * <code>{@link ProjectStage#PROJECT_STAGE_JNDI_NAME}</code> (return type of java.lang.String). If found, continue
+ * with the algorithm below, otherwise, look for an entry in the <code>initParamMap</code> of the
+ * <code>ExternalContext</code> from the current <code>FacesContext</code> with the key
+ * <code>{@link ProjectStage#PROJECT_STAGE_PARAM_NAME}</code></li>
+ * <li>If a value is found found, see if an enum constant can be obtained by calling
+ * <code>ProjectStage.valueOf()</code>, passing the value from the <code>initParamMap</code>. If this succeeds
+ * without exception, save the value and return it.</li>
+ * <li>If not found, or any of the previous attempts to discover the enum constant value have failed, log a
+ * descriptive error message, assign the value as <code>ProjectStage.Production</code> and return it.</li>
+ * </ul>
+ *
+ * @since 2.0
+ */
+ public ProjectStage getProjectStage()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getProjectStage();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Get the object used by the VariableResolver to read and write named properties on java beans, Arrays, Lists and
+ * Maps. This object is used by the ValueBinding implementation, and during the process of configuring
+ * "managed bean" properties.
+ *
+ * @deprecated
+ */
+ public abstract PropertyResolver getPropertyResolver();
+
+ /**
+ * <p>
+ * Find a <code>ResourceBundle</code> as defined in the application configuration resources under the specified
+ * name. If a <code>ResourceBundle</code> was defined for the name, return an instance that uses the locale of the
+ * current <code>{@link jakarta.faces.component.UIViewRoot}</code>.
+ * </p>
+ *
+ * <p>
+ * The default implementation throws <code>UnsupportedOperationException</code> and is provided for the sole purpose
+ * of not breaking existing applications that extend this class.
+ * </p>
+ *
+ * @return <code>ResourceBundle</code> for the current UIViewRoot, otherwise null
+ *
+ * @throws FacesException
+ * if a bundle was defined, but not resolvable
+ * @throws NullPointerException
+ * if ctx == null || name == null
+ */
+ public ResourceBundle getResourceBundle(FacesContext ctx, String name)
+ {
+ Application application = getMyfacesApplicationInstance(ctx);
+ if (application != null)
+ {
+ return application.getResourceBundle(ctx, name);
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Return the singleton, stateless, thread-safe <code>{@link ResourceHandler}</code> for this application. The JSF
+ * implementation must support the following techniques for declaring an alternate implementation of <code>
+ * ResourceHandler</code>.
+ * </p>
+ *
+ * <ul>
+ * <li>The <code>ResourceHandler</code> implementation is declared in the application configuration resources by
+ * giving the fully qualified class name as the value of the <code><resource-handler></code> element
+ * within the
+ * <code>application</code> element.</li>
+ * <li>RELEASE_PENDING(edburns) It can also be declared via an annotation as
+ * specified in [287-ConfigAnnotations].</li>
+ * </ul>
+ *
+ * <p>
+ * In all of the above cases, the runtime must employ the decorator pattern as for every other pluggable artifact in
+ * JSF.
+ * </p>
+ *
+ * @since 2.0
+ */
+ public ResourceHandler getResourceHandler()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getResourceHandler();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Return the <code>StateManager</code> instance that will be utilized during the Restore View and Render Response
+ * phases of the request processing lifecycle. If not explicitly set, a default implementation must be provided that
+ * performs the functions described in the <code>StateManager</code> description in the JavaServer Faces
+ * Specification.
+ */
+ public abstract StateManager getStateManager();
+
+ /**
+ * Return an <code>Iterator</code> over the supported <code>Locales</code> for this appication.
+ */
+ public abstract Iterator<Locale> getSupportedLocales();
+
+ /**
+ *Return an <code>Iterator</code> over the set of currently registered validator ids for this
+ * <code>Application</code>.
+ */
+ public abstract Iterator<String> getValidatorIds();
+
+ /**
+ * Get the object used to resolve expressions of form "#{...}".
+ *
+ * @deprecated
+ */
+ public abstract VariableResolver getVariableResolver();
+
+ /**
+ * Set the <code>{@link ViewHandler}</code> instance that will be utilized during the
+ * <code> Restore View and Render Response</code> phases of the request processing lifecycle.
+ *
+ * @return
+ */
+ public abstract ViewHandler getViewHandler();
+
+ /**
+ *
+ * @param facesContext
+ * @param systemEventClass
+ * @param sourceBaseType
+ * @param source
+ *
+ * @since 2.0
+ */
+ public void publishEvent(FacesContext facesContext, Class<? extends SystemEvent> systemEventClass,
+ Class<?> sourceBaseType, Object source)
+ {
+ Application application = getMyfacesApplicationInstance(facesContext);
+ if (application != null)
+ {
+ application.publishEvent(facesContext, systemEventClass, sourceBaseType, source);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * If there are one or more listeners for events of the type represented by <code>systemEventClass</code>, call
+ * those listeners,passing source as the <code>source</code> of the event. The implementation should be as fast as
+ * possible in determining whether or not a listener for the given <code>systemEventClass</code> and
+ * <code>source</code> has been installed, and should return immediately once such a determination has been made.
+ * The implementation of <code>publishEvent</code> must honor the requirements stated in
+ * <code>{@link #subscribeToEvent(java.lang.Class, java.lang.Class,
+ * SystemEventListener)}</code>
+ * <p>
+ * <p>
+ * The default implementation must implement an algorithm semantically equivalent to the following to locate
+ * listener instances and to invoke them.
+ * <p>
+ * <ul>
+ * <li>If the <code>source</code> argument implements
+ * <code>{@link jakarta.faces.event.SystemEventListenerHolder}</code>, call
+ * <code>{@linkjakarta.faces.event.SystemEventListenerHolder#getListenersForEventClass(java.lang.Class)}</code>
+ * on it, passing the
+ * <code>systemEventClass</code> argument. If the list is not empty, perform algorithm
+ * <code>traverseListenerList</code> on the list.</li>
+ *
+ * <li>If any <code>Application</code> level listeners have been installed by previous calls to <code>{@link
+ * #subscribeToEvent(java.lang.Class, java.lang.Class, SystemEventListener)}</code>, perform algorithm
+ * <code>traverseListenerList</code> on the list.</li>
+ *
+ * <li>If any <code>Application</code> level listeners have been installed by previous calls to
+ * <code>{@link #subscribeToEvent(java.lang.Class, SystemEventListener)}</code>, perform algorithm
+ * <code>traverseListenerList</code> on the list.</li>
+ * </ul>
+ *
+ * <p>
+ * If the act of invoking the <code>processListener</code> method causes an
+ * <code>{@link jakarta.faces.event.AbortProcessingException}</code> to be thrown,
+ * processing of the listeners must be aborted.
+ * </p>
+ *
+ * <p>
+ * Algorithm <code>traverseListenerList</code>: For each listener in the list,
+ * </p>
+ *
+ * <ul>
+ * <li>Call
+ * <code>{@link SystemEventListener#isListenerForSource(java.lang.Object)}</code>, passing the <code>source</code>
+ * argument. If this returns <code>false</code>, take no action on the listener.</li>
+ *
+ * <li>Otherwise, if the event to be passed to the listener instances has not yet been constructed, construct the
+ * event, passing <code>source</code> as the argument to the one-argument constructor that takes an
+ * <code>Object</code>. This same event instance must be passed to all listener instances.</li>
+ *
+ * <li>Call
+ * <code>{@link SystemEvent#isAppropriateListener(jakarta.faces.event.FacesListener)}</code>, passing the listener
+ * instance as the argument. If this returns <code>false</code>, take no action on the listener.</li>
+ *
+ * <li>Call <code>{@link SystemEvent#processListener(jakarta.faces.event.FacesListener)}</code>,
+ * passing the listener instance.</li>
+ * </ul>
+ *
+ * @param systemEventClass
+ * - The Class of event that is being published. Must be non-null.
+ *
+ * @param source
+ * - The <code>source</code> for the event of type systemEventClass. Must be non- <code>null</code>, and
+ * must implement <code>{@link jakarta.faces.event.SystemEventListenerHolder}</code>.
+ *
+ * @since 2.0
+ */
+ public void publishEvent(FacesContext facesContext, Class<? extends SystemEvent> systemEventClass, Object source)
+ {
+ Application application = getMyfacesApplicationInstance(facesContext);
+ if (application != null)
+ {
+ application.publishEvent(facesContext, systemEventClass, source);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * <p>
+ * Remove the argument <code>listener</code> from the list of <code>ELContextListeners</code>. If <code>listener
+ * </code> is null, no exception is thrown and no action is performed. If <code>listener</code> is not in the list,
+ * no exception is thrown and no action is performed.
+ * <p>
+ *
+ * <p>
+ * An implementation is provided that throws <code>UnsupportedOperationException</code> so that users that decorate
+ * the <code>Application</code> continue to work.
+ *
+ * @param listener
+ */
+ public void removeELContextListener(ELContextListener listener)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.removeELContextListener(listener);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Set the default <code>{@link ActionListener}</code> to be registered for all
+ * <code>{@link jakarta.faces.component.ActionSource}</code>
+ * components.
+ *
+ * @param listener
+ * - The new default <code>{@link ActionListener}</code>
+ *
+ * @throws NullPointerException
+ * if listener is null
+ */
+ public abstract void setActionListener(ActionListener listener);
+
+ /**
+ * Set the default <code>Locale</code> for this application.
+ *
+ * @param locale
+ * - The new default <code>Locale</code>
+ *
+ * @throws NullPointerException
+ * if listener is null
+ */
+ public abstract void setDefaultLocale(Locale locale);
+
+ /**
+ * Return the <code>renderKitId</code> to be used for rendering this application. If not explicitly set, <code>null
+ * </code> is returned.
+ *
+ * @param renderKitId
+ */
+ public abstract void setDefaultRenderKitId(String renderKitId);
+
+ /**
+ * Set the fully qualified class name of the <code>ResourceBundle </code> to be used for JavaServer Faces messages
+ * for this application. See the JavaDocs for the <code>java.util.ResourceBundle </code> class for more information
+ * about the syntax for resource bundle names.
+ *
+ * @param bundle
+ * - Base name of the resource bundle to be used
+ *
+ * @throws NullPointerException
+ * if bundle is null
+ */
+ public abstract void setMessageBundle(String bundle);
+
+ /**
+ * Set the {@link NavigationHandler} instance that will be passed the outcome returned by any invoked application
+ * action for this web application.
+ *
+ * @param handler
+ * - The new NavigationHandler instance
+ */
+ public abstract void setNavigationHandler(NavigationHandler handler);
+
+ /**
+ * The recommended way to affect the execution of the EL is to provide an <el-resolver> element at the right
+ * place in the application configuration resources which will be considered in the normal course of expression
+ * evaluation. This method now will cause the argument resolver to be wrapped inside an implementation of ELResolver
+ * and exposed to the EL resolution system as if the user had called addELResolver(javax.el.ELResolver).
+ *
+ * @deprecated
+ */
+ public abstract void setPropertyResolver(PropertyResolver resolver);
+
+ /**
+ *
+ * @param resourceHandler
+ *
+ * @since 2.0
+ */
+ public void setResourceHandler(ResourceHandler resourceHandler)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.setResourceHandler(resourceHandler);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *Set the {@link StateManager} instance that will be utilized during the <code>Restore View and Render Response
+ * </code> phases of the request processing lifecycle.
+ *
+ * @param manager The new {@link StateManager}instance
+ *
+ * @throws IllegalStateException
+ * if this method is called after at least one request has been processed by the <code>Lifecycle</code>
+ * instance for this application.
+ * @throws NullPointerException
+ * if manager is <code>null</code>
+ */
+ public abstract void setStateManager(StateManager manager);
+
+ /**
+ * Set the <code>Locale</code> instances representing the supported <code>Locales</code> for this application.
+ *
+ * @param locales The set of supported <code>Locales</code> for this application
+ *
+ * @throws NullPointerException
+ * if the argument newLocales is <code>null</code>.
+ *
+ */
+ public abstract void setSupportedLocales(Collection<Locale> locales);
+
+ /**
+ * The recommended way to affect the execution of the EL is to provide an <el-resolver> element at the right
+ * place in the application configuration resources which will be considered in the normal course of expression
+ * evaluation. This method now will cause the argument resolver to be wrapped inside an implementation of ELResolver
+ * and exposed to the EL resolution system as if the user had called addELResolver(javax.el.ELResolver).
+ *
+ * @deprecated
+ */
+ public abstract void setVariableResolver(VariableResolver resolver);
+
+ /**
+ * Set the {@link ViewHandler} instance that will be utilized during the <code>Restore View and Render Response
+ * </code> phases of the request processing lifecycle.
+ *
+ * @param handler
+ * - The new {@link ViewHandler} instance
+ *
+ * @throws IllegalStateException
+ * if this method is called after at least one request has been processed by the <code>Lifecycle</code>
+ * instance for this application.
+ * @throws NullPointerException
+ * if <code>handler</code> is <code>null</code>
+ */
+ public abstract void setViewHandler(ViewHandler handler);
+
+ /**
+ *
+ * @param systemEventClass
+ * @param sourceClass
+ * @param listener
+ *
+ * @since 2.0
+ */
+ public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass, Class<?> sourceClass,
+ SystemEventListener listener)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.subscribeToEvent(systemEventClass, sourceClass, listener);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *
+ * @param systemEventClass
+ * @param listener
+ *
+ * @since 2.0
+ */
+ public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass, SystemEventListener listener)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.subscribeToEvent(systemEventClass, listener);
+ return;
+ }
+ subscribeToEvent(systemEventClass, null, listener);
+ }
+
+ /**
+ *
+ * @param systemEventClass
+ * @param sourceClass
+ * @param listener
+ *
+ * @since 2.0
+ */
+ public void unsubscribeFromEvent(Class<? extends SystemEvent> systemEventClass, Class<?> sourceClass,
+ SystemEventListener listener)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.unsubscribeFromEvent(systemEventClass, sourceClass, listener);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ *
+ * @param systemEventClass
+ * @param listener
+ *
+ * @since 2.0
+ */
+ public void unsubscribeFromEvent(Class<? extends SystemEvent> systemEventClass, SystemEventListener listener)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.unsubscribeFromEvent(systemEventClass, listener);
+ return;
+ }
+ unsubscribeFromEvent(systemEventClass, null, listener);
+ }
+
+ /**
+ * @since 2.2
+ * @return
+ */
+ public FlowHandler getFlowHandler()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getFlowHandler();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @since 2.2
+ * @param flowHandler
+ */
+ public void setFlowHandler(FlowHandler flowHandler)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.setFlowHandler(flowHandler);
+ return;
+ }
+ throw new UnsupportedOperationException();
+
+ }
+
+ public void addSearchKeywordResolver(SearchKeywordResolver resolver)
+ {
+ // The following concrete methods were added for JSF 1.2. They supply default
+ // implementations that throw UnsupportedOperationException.
+ // This allows old Application implementations to still work.
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.addSearchKeywordResolver(resolver);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ public SearchKeywordResolver getSearchKeywordResolver()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getSearchKeywordResolver();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @since 2.3
+ * @return
+ */
+ public SearchExpressionHandler getSearchExpressionHandler()
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ return application.getSearchExpressionHandler();
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @since 2.3
+ * @param searchExpressionHandler
+ */
+ public void setSearchExpressionHandler(SearchExpressionHandler searchExpressionHandler)
+ {
+ Application application = getMyfacesApplicationInstance();
+ if (application != null)
+ {
+ application.setSearchExpressionHandler(searchExpressionHandler);
+ return;
+ }
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/ApplicationConfigurationPopulator.java b/api/src/main/java/jakarta/faces/application/ApplicationConfigurationPopulator.java
new file mode 100644
index 0000000..ad88877
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ApplicationConfigurationPopulator.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import org.w3c.dom.Document;
+
+public abstract class ApplicationConfigurationPopulator
+{
+
+ public abstract void populateApplicationConfiguration(Document toPopulate);
+}
diff --git a/api/src/main/java/jakarta/faces/application/ApplicationFactory.java b/api/src/main/java/jakarta/faces/application/ApplicationFactory.java
new file mode 100644
index 0000000..43737b3
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ApplicationFactory.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import jakarta.faces.FacesWrapper;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public abstract class ApplicationFactory implements FacesWrapper<ApplicationFactory>
+{
+ private ApplicationFactory delegate;
+
+ @Deprecated
+ public ApplicationFactory()
+ {
+ }
+
+ public ApplicationFactory(ApplicationFactory delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public abstract Application getApplication();
+
+ /**
+ * If this factory has been decorated, the implementation doing the decorating may override this method to
+ * provide access to the implementation being wrapped. A default implementation is provided that returns
+ * <code>null</code>.
+ *
+ * @return the decorated <code>ApplicationFactory</code> if this factory decorates another,
+ * or <code>null</code> otherwise
+ *
+ * @since 2.0
+ */
+ public ApplicationFactory getWrapped()
+ {
+ return delegate;
+ }
+
+ public abstract void setApplication(Application application);
+}
diff --git a/api/src/main/java/jakarta/faces/application/ApplicationWrapper.java b/api/src/main/java/jakarta/faces/application/ApplicationWrapper.java
new file mode 100644
index 0000000..152b495
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ApplicationWrapper.java
@@ -0,0 +1,492 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import jakarta.faces.component.behavior.Behavior;
+import jakarta.faces.component.search.SearchExpressionHandler;
+import jakarta.faces.component.search.SearchKeywordResolver;
+import jakarta.faces.validator.Validator;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import javax.el.ELContextListener;
+import javax.el.ELException;
+import javax.el.ELResolver;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
+import jakarta.faces.FacesException;
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.component.UIComponent;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.convert.Converter;
+import jakarta.faces.el.MethodBinding;
+import jakarta.faces.el.PropertyResolver;
+import jakarta.faces.el.ReferenceSyntaxException;
+import jakarta.faces.el.ValueBinding;
+import jakarta.faces.el.VariableResolver;
+import jakarta.faces.event.ActionListener;
+import jakarta.faces.event.SystemEvent;
+import jakarta.faces.event.SystemEventListener;
+import jakarta.faces.flow.FlowHandler;
+
+/**
+ * @since 2.0
+ */
+@SuppressWarnings("deprecation")
+public abstract class ApplicationWrapper extends Application implements FacesWrapper<Application>
+{
+ private Application delegate;
+
+ @Deprecated
+ public ApplicationWrapper()
+ {
+
+ }
+
+ public ApplicationWrapper(Application delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void addBehavior(String behaviorId, String behaviorClass)
+ {
+ getWrapped().addBehavior(behaviorId, behaviorClass);
+ }
+
+ @Override
+ public void addComponent(String componentType, String componentClass)
+ {
+ getWrapped().addComponent(componentType, componentClass);
+ }
+
+ @Override
+ public void addConverter(Class<?> targetClass, String converterClass)
+ {
+ getWrapped().addConverter(targetClass, converterClass);
+ }
+
+ @Override
+ public void addConverter(String converterId, String converterClass)
+ {
+ getWrapped().addConverter(converterId, converterClass);
+ }
+
+ @Override
+ public void addDefaultValidatorId(String validatorId)
+ {
+ getWrapped().addDefaultValidatorId(validatorId);
+ }
+
+ @Override
+ public void addELContextListener(ELContextListener listener)
+ {
+ getWrapped().addELContextListener(listener);
+ }
+
+ @Override
+ public void addELResolver(ELResolver resolver)
+ {
+ getWrapped().addELResolver(resolver);
+ }
+
+ @Override
+ public void addValidator(String validatorId, String validatorClass)
+ {
+ getWrapped().addValidator(validatorId, validatorClass);
+ }
+
+ @Override
+ public Behavior createBehavior(String behaviorId) throws FacesException
+ {
+ return getWrapped().createBehavior(behaviorId);
+ }
+
+ @Override
+ public UIComponent createComponent(FacesContext context, Resource componentResource)
+ {
+ return getWrapped().createComponent(context, componentResource);
+ }
+
+ @Override
+ public UIComponent createComponent(FacesContext context, String componentType, String rendererType)
+ {
+ return getWrapped().createComponent(context, componentType, rendererType);
+ }
+
+ @Override
+ public UIComponent createComponent(String componentType) throws FacesException
+ {
+ return getWrapped().createComponent(componentType);
+ }
+
+ @Override
+ @Deprecated
+ public UIComponent createComponent(ValueBinding componentBinding, FacesContext context, String componentType)
+ throws FacesException
+ {
+ return getWrapped().createComponent(componentBinding, context, componentType);
+ }
+
+ @Override
+ public UIComponent createComponent(ValueExpression componentExpression, FacesContext context, String componentType,
+ String rendererType)
+ {
+ return getWrapped().createComponent(componentExpression, context, componentType, rendererType);
+ }
+
+ @Override
+ public UIComponent createComponent(ValueExpression componentExpression, FacesContext contexte, String componentType)
+ throws FacesException
+ {
+ return getWrapped().createComponent(componentExpression, contexte, componentType);
+ }
+
+ @Override
+ public Converter createConverter(Class<?> targetClass)
+ {
+ return getWrapped().createConverter(targetClass);
+ }
+
+ @Override
+ public Converter createConverter(String converterId)
+ {
+ return getWrapped().createConverter(converterId);
+ }
+
+ @Override
+ @Deprecated
+ public MethodBinding createMethodBinding(String ref, Class<?>[] params) throws ReferenceSyntaxException
+ {
+ return getWrapped().createMethodBinding(ref, params);
+ }
+
+ @Override
+ public Validator createValidator(String validatorId) throws FacesException
+ {
+ return getWrapped().createValidator(validatorId);
+ }
+
+ @Override
+ public ValueBinding createValueBinding(String ref) throws ReferenceSyntaxException
+ {
+ return getWrapped().createValueBinding(ref);
+ }
+
+ @Override
+ @Deprecated
+ public <T> T evaluateExpressionGet(FacesContext context, String expression, Class<? extends T> expectedType)
+ throws ELException
+ {
+ return getWrapped().evaluateExpressionGet(context, expression, expectedType);
+ }
+
+ @Override
+ public ActionListener getActionListener()
+ {
+ return getWrapped().getActionListener();
+ }
+
+ @Override
+ public Iterator<String> getBehaviorIds()
+ {
+ return getWrapped().getBehaviorIds();
+ }
+
+ @Override
+ public Iterator<String> getComponentTypes()
+ {
+ return getWrapped().getComponentTypes();
+ }
+
+ @Override
+ public Iterator<String> getConverterIds()
+ {
+ return getWrapped().getConverterIds();
+ }
+
+ @Override
+ public Iterator<Class<?>> getConverterTypes()
+ {
+ return getWrapped().getConverterTypes();
+ }
+
+ @Override
+ public Locale getDefaultLocale()
+ {
+ return getWrapped().getDefaultLocale();
+ }
+
+ @Override
+ public String getDefaultRenderKitId()
+ {
+ return getWrapped().getDefaultRenderKitId();
+ }
+
+ @Override
+ public Map<String, String> getDefaultValidatorInfo()
+ {
+ return getWrapped().getDefaultValidatorInfo();
+ }
+
+ @Override
+ public ELContextListener[] getELContextListeners()
+ {
+ return getWrapped().getELContextListeners();
+ }
+
+ @Override
+ public ELResolver getELResolver()
+ {
+ return getWrapped().getELResolver();
+ }
+
+ @Override
+ public ExpressionFactory getExpressionFactory()
+ {
+ return getWrapped().getExpressionFactory();
+ }
+
+ @Override
+ public String getMessageBundle()
+ {
+ return getWrapped().getMessageBundle();
+ }
+
+ @Override
+ public NavigationHandler getNavigationHandler()
+ {
+ return getWrapped().getNavigationHandler();
+ }
+
+ @Override
+ public ProjectStage getProjectStage()
+ {
+ return getWrapped().getProjectStage();
+ }
+
+ @Override
+ @Deprecated
+ public PropertyResolver getPropertyResolver()
+ {
+ return getWrapped().getPropertyResolver();
+ }
+
+ @Override
+ public ResourceBundle getResourceBundle(FacesContext ctx, String name)
+ {
+ return getWrapped().getResourceBundle(ctx, name);
+ }
+
+ @Override
+ public ResourceHandler getResourceHandler()
+ {
+ return getWrapped().getResourceHandler();
+ }
+
+ @Override
+ public StateManager getStateManager()
+ {
+ return getWrapped().getStateManager();
+ }
+
+ @Override
+ public Iterator<Locale> getSupportedLocales()
+ {
+ return getWrapped().getSupportedLocales();
+ }
+
+ @Override
+ public Iterator<String> getValidatorIds()
+ {
+ return getWrapped().getValidatorIds();
+ }
+
+ @Override
+ @Deprecated
+ public VariableResolver getVariableResolver()
+ {
+ return getWrapped().getVariableResolver();
+ }
+
+ @Override
+ public ViewHandler getViewHandler()
+ {
+ return getWrapped().getViewHandler();
+ }
+
+ public Application getWrapped()
+ {
+ return delegate;
+ }
+
+ @Override
+ public void publishEvent(FacesContext facesContext, Class<? extends SystemEvent> systemEventClass,
+ Class<?> sourceBaseType, Object source)
+ {
+ getWrapped().publishEvent(facesContext, systemEventClass, sourceBaseType, source);
+ }
+
+ @Override
+ public void publishEvent(FacesContext facesContext, Class<? extends SystemEvent> systemEventClass, Object source)
+ {
+ getWrapped().publishEvent(facesContext, systemEventClass, source);
+ }
+
+ @Override
+ public void removeELContextListener(ELContextListener listener)
+ {
+ getWrapped().removeELContextListener(listener);
+ }
+
+ @Override
+ public void setActionListener(ActionListener listener)
+ {
+ getWrapped().setActionListener(listener);
+ }
+
+ @Override
+ public void setDefaultLocale(Locale locale)
+ {
+ getWrapped().setDefaultLocale(locale);
+ }
+
+ @Override
+ public void setDefaultRenderKitId(String renderKitId)
+ {
+ getWrapped().setDefaultRenderKitId(renderKitId);
+ }
+
+ @Override
+ public void setMessageBundle(String bundle)
+ {
+ getWrapped().setMessageBundle(bundle);
+ }
+
+ @Override
+ public void setNavigationHandler(NavigationHandler handler)
+ {
+ getWrapped().setNavigationHandler(handler);
+ }
+
+ @Override
+ @Deprecated
+ public void setPropertyResolver(PropertyResolver resolver)
+ {
+ getWrapped().setPropertyResolver(resolver);
+ }
+
+ @Override
+ public void setResourceHandler(ResourceHandler resourceHandler)
+ {
+ getWrapped().setResourceHandler(resourceHandler);
+ }
+
+ @Override
+ public void setStateManager(StateManager manager)
+ {
+ getWrapped().setStateManager(manager);
+ }
+
+ @Override
+ public void setSupportedLocales(Collection<Locale> locales)
+ {
+ getWrapped().setSupportedLocales(locales);
+ }
+
+ @Override
+ @Deprecated
+ public void setVariableResolver(VariableResolver resolver)
+ {
+ getWrapped().setVariableResolver(resolver);
+ }
+
+ @Override
+ public void setViewHandler(ViewHandler handler)
+ {
+ getWrapped().setViewHandler(handler);
+ }
+
+ @Override
+ public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass, Class<?> sourceClass,
+ SystemEventListener listener)
+ {
+ getWrapped().subscribeToEvent(systemEventClass, sourceClass, listener);
+ }
+
+ @Override
+ public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass, SystemEventListener listener)
+ {
+ getWrapped().subscribeToEvent(systemEventClass, listener);
+ }
+
+ @Override
+ public void unsubscribeFromEvent(Class<? extends SystemEvent> systemEventClass, Class<?> sourceClass,
+ SystemEventListener listener)
+ {
+ getWrapped().unsubscribeFromEvent(systemEventClass, sourceClass, listener);
+ }
+
+ @Override
+ public void unsubscribeFromEvent(Class<? extends SystemEvent> systemEventClass, SystemEventListener listener)
+ {
+ getWrapped().unsubscribeFromEvent(systemEventClass, listener);
+ }
+
+ @Override
+ public void setFlowHandler(FlowHandler flowHandler)
+ {
+ getWrapped().setFlowHandler(flowHandler);
+ }
+
+ @Override
+ public FlowHandler getFlowHandler()
+ {
+ return getWrapped().getFlowHandler();
+ }
+
+ @Override
+ public void setSearchExpressionHandler(SearchExpressionHandler searchExpressionHandler)
+ {
+ getWrapped().setSearchExpressionHandler(searchExpressionHandler);
+ }
+
+ @Override
+ public SearchExpressionHandler getSearchExpressionHandler()
+ {
+ return getWrapped().getSearchExpressionHandler();
+ }
+
+ @Override
+ public SearchKeywordResolver getSearchKeywordResolver()
+ {
+ return getWrapped().getSearchKeywordResolver();
+ }
+
+ @Override
+ public void addSearchKeywordResolver(SearchKeywordResolver resolver)
+ {
+ getWrapped().addSearchKeywordResolver(resolver);
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/ConfigurableNavigationHandler.java b/api/src/main/java/jakarta/faces/application/ConfigurableNavigationHandler.java
new file mode 100644
index 0000000..5a89e91
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ConfigurableNavigationHandler.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.flow.Flow;
+
+/**
+ * @since 2.0
+ */
+public abstract class ConfigurableNavigationHandler extends NavigationHandler
+{
+
+ /**
+ *
+ */
+ public ConfigurableNavigationHandler()
+ {
+ }
+
+ public abstract NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome);
+
+ public abstract Map<String,Set<NavigationCase>> getNavigationCases();
+
+ public void performNavigation(String outcome)
+ {
+ handleNavigation(FacesContext.getCurrentInstance(), null, outcome);
+ }
+
+ /**
+ * @since 2.2
+ * @param context
+ * @param flow
+ */
+ public void inspectFlow(FacesContext context, Flow flow)
+ {
+ }
+
+ /**
+ * @since 2.2
+ * @param context
+ * @param fromAction
+ * @param outcome
+ * @param toFlowDocumentId
+ * @return
+ */
+ public NavigationCase getNavigationCase(FacesContext context,
+ java.lang.String fromAction,
+ java.lang.String outcome,
+ java.lang.String toFlowDocumentId)
+ {
+ return getNavigationCase(context, fromAction, outcome);
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/ConfigurableNavigationHandlerWrapper.java b/api/src/main/java/jakarta/faces/application/ConfigurableNavigationHandlerWrapper.java
new file mode 100644
index 0000000..b6cd180
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ConfigurableNavigationHandlerWrapper.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.util.Map;
+import java.util.Set;
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.flow.Flow;
+
+/**
+ *
+ * @since 2.2
+ */
+public abstract class ConfigurableNavigationHandlerWrapper extends ConfigurableNavigationHandler
+ implements FacesWrapper<ConfigurableNavigationHandler>
+{
+ private ConfigurableNavigationHandler delegate;
+
+ @Deprecated
+ public ConfigurableNavigationHandlerWrapper()
+ {
+ }
+
+ public ConfigurableNavigationHandlerWrapper(ConfigurableNavigationHandler delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome)
+ {
+ return getWrapped().getNavigationCase(context, fromAction, outcome);
+ }
+
+ @Override
+ public Map<String, Set<NavigationCase>> getNavigationCases()
+ {
+ return getWrapped().getNavigationCases();
+ }
+
+ @Override
+ public void handleNavigation(FacesContext context, String fromAction, String outcome)
+ {
+ getWrapped().handleNavigation(context, fromAction, outcome);
+ }
+
+ @Override
+ public void performNavigation(String outcome)
+ {
+ getWrapped().performNavigation(outcome);
+ }
+
+ @Override
+ public void inspectFlow(FacesContext context, Flow flow)
+ {
+ getWrapped().inspectFlow(context, flow);
+ }
+
+ @Override
+ public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome,
+ String toFlowDocumentId)
+ {
+ return getWrapped().getNavigationCase(context, fromAction, outcome, toFlowDocumentId);
+ }
+
+ public ConfigurableNavigationHandler getWrapped()
+ {
+ return delegate;
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/FacesMessage.java b/api/src/main/java/jakarta/faces/application/FacesMessage.java
new file mode 100644
index 0000000..66c7451
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/FacesMessage.java
@@ -0,0 +1,295 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *<p>
+ * <code>FacesMessage</code> represents a single validation (or other) message, which is typically associated with a
+ * particular component in the view. A {@link FacesMessage} instance may be created based on a specific messageId. The
+ * specification defines the set of messageIds for which there must be {@link FacesMessage} instances.
+ * </p>
+ *
+ * The implementation must take the following steps when creating FacesMessage instances given a messageId:
+ * <ul>
+ * <li>Call
+ * {@link Application#getMessageBundle()}. If <code>non-null</code>, locate the named <code>ResourceBundle</code>, using
+ * the <code>Locale</code> from the current {@link jakarta.faces.component.UIViewRoot} and see if it has a value for
+ * the argument
+ * <code>messageId</code>. If it does, treat the value as the <code>summary</code> of the {@link FacesMessage}. If it
+ * does not, or if {@link Application#getMessageBundle()} returned null, look in the ResourceBundle named by the value
+ * of the constant {@link #FACES_MESSAGES} and see if it has a value for the argument messageId. If it does, treat the
+ * value as the summary of the <code>FacesMessage</code>. If it does not, there is no initialization information for the
+ * <code>FacesMessage</code> instance.</li>
+ * <li>In all cases, if a <code>ResourceBundle</code> hit is found for the
+ * <code>{messageId}</code>, look for further hits under the key <code>{messageId}_detail</code>. Use this value, if
+ * present, as the <code>detail</code> for the returned <code>FacesMessage</code>.</li>
+ * <li>Make sure to perform any
+ * parameter substitution required for the <code>summary</code> and <code>detail</code> of the <code>FacesMessage</code>
+ * .</li>
+ * </ul>
+ *
+ */
+public class FacesMessage implements Serializable
+{
+ private static final long serialVersionUID = 4851488727794169661L;
+
+ /**
+ * <code>ResourceBundle</code> identifier for messages whose message identifiers are defined in the JavaServer Faces
+ * specification.
+ */
+ public static final String FACES_MESSAGES = "jakarta.faces.Messages";
+
+ /**
+ * Message severity level indicating an informational message rather than an error.
+ */
+ public static final FacesMessage.Severity SEVERITY_INFO = new Severity("INFO", 0);
+
+ /**
+ * Message severity level indicating that an error might have occurred.
+ */
+ public static final FacesMessage.Severity SEVERITY_WARN = new Severity("WARN", 1);
+
+ /**
+ * Message severity level indicating that an error has occurred.
+ */
+ public static final FacesMessage.Severity SEVERITY_ERROR = new Severity("ERROR", 2);
+
+ /**
+ * Message severity level indicating that a serious error has occurred.
+ */
+ public static final FacesMessage.Severity SEVERITY_FATAL = new Severity("FATAL", 3);
+
+ /**
+ * Immutable <code>Lis</code> of valid {@link FacesMessage.Severity}instances, in ascending order of their ordinal
+ * value.
+ */
+ public static final List VALUES;
+
+ /**
+ * Immutable <code>Map</code> of valid {@link FacesMessage.Severity}instances, keyed by name.
+ */
+ public static final Map VALUES_MAP;
+
+ static
+ {
+ Map<String, FacesMessage.Severity> map = new HashMap<String, Severity>(7);
+ map.put(SEVERITY_INFO.toString(), SEVERITY_INFO);
+ map.put(SEVERITY_WARN.toString(), SEVERITY_WARN);
+ map.put(SEVERITY_ERROR.toString(), SEVERITY_ERROR);
+ map.put(SEVERITY_FATAL.toString(), SEVERITY_FATAL);
+ VALUES_MAP = Collections.unmodifiableMap(map);
+
+ List<FacesMessage.Severity> severityList = new ArrayList<Severity>(map.values());
+ Collections.sort(severityList); // the JSF spec requires it to be sorted
+ VALUES = Collections.unmodifiableList(severityList);
+ }
+
+ private transient FacesMessage.Severity _severity; // transient, b/c FacesMessage.Severity is not Serializable
+ private String _summary;
+ private String _detail;
+ private boolean _rendered;
+
+ /**
+ *Construct a new {@link FacesMessage} with no initial values. The severity is set to Severity.INFO.
+ */
+ public FacesMessage()
+ {
+ _severity = SEVERITY_INFO;
+ _rendered = false;
+ }
+
+ /**
+ * Construct a new {@link FacesMessage} with just a summary. The detail is null, the severity is set to
+ * <code>Severity.INFO</code>.
+ */
+ public FacesMessage(String summary)
+ {
+ _summary = summary;
+ _severity = SEVERITY_INFO;
+ _rendered = false;
+ }
+
+ /**
+ * Construct a new {@link FacesMessage} with the specified initial values. The severity is set to Severity.INFO.
+ *
+ * @param summary
+ * - Localized summary message text
+ * @param detail
+ * - Localized detail message text
+ */
+ public FacesMessage(String summary, String detail)
+ {
+ _summary = summary;
+ _detail = detail;
+ _severity = SEVERITY_INFO;
+ _rendered = false;
+ }
+
+ /**
+ * Construct a new {@link FacesMessage}with the specified initial values.
+ *
+ * @param severity
+ * - the severity
+ * @param summary
+ * - Localized summary message text
+ * @param detail
+ * - Localized detail message text
+ */
+ public FacesMessage(FacesMessage.Severity severity, String summary, String detail)
+ {
+ if (severity == null)
+ {
+ throw new NullPointerException("severity");
+ }
+ _severity = severity;
+ _summary = summary;
+ _detail = detail;
+ _rendered = false;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public FacesMessage.Severity getSeverity()
+ {
+ return _severity;
+ }
+
+ /**
+ * Return the severity level.
+ */
+ public void setSeverity(FacesMessage.Severity severity)
+ {
+ if (severity == null)
+ {
+ throw new NullPointerException("severity");
+ }
+ _severity = severity;
+ }
+
+ /**
+ * Return the localized summary text.
+ */
+ public String getSummary()
+ {
+ return _summary;
+ }
+
+ /**
+ * Set the localized summary text.
+ *
+ * @param summary
+ * - The new localized summary text
+ */
+ public void setSummary(String summary)
+ {
+ _summary = summary;
+ }
+
+ /**
+ *
+ * @return
+ */
+ public String getDetail()
+ {
+ if (_detail == null)
+ {
+ // Javadoc:
+ // If no localized detail text has been defined for this message, return the localized summary text instead
+ return _summary;
+ }
+ return _detail;
+ }
+
+ /**
+ * Set the localized detail text.
+ *
+ * @param detail
+ * - The new localized detail text
+ */
+ public void setDetail(String detail)
+ {
+ _detail = detail;
+ }
+
+ public boolean isRendered()
+ {
+ return _rendered;
+ }
+
+ public void rendered()
+ {
+ this._rendered = true;
+ }
+
+ private void writeObject(ObjectOutputStream out) throws IOException
+ {
+ out.defaultWriteObject(); // write summary, detail, rendered
+ out.writeInt(_severity._ordinal); // FacesMessage.Severity is not Serializable, write ordinal only
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
+ {
+ in.defaultReadObject(); // read summary, detail, rendered
+
+ // FacesMessage.Severity is not Serializable, read ordinal and get related FacesMessage.Severity
+ int severityOrdinal = in.readInt();
+ _severity = (Severity) VALUES.get(severityOrdinal);
+ }
+
+ public static class Severity implements Comparable
+ {
+ private String _name;
+ private int _ordinal;
+
+ private Severity(String name, int ordinal)
+ {
+ _name = name;
+ _ordinal = ordinal;
+ }
+
+ public int getOrdinal()
+ {
+ return _ordinal;
+ }
+
+ @Override
+ public String toString()
+ {
+ return _name;
+ }
+
+ public int compareTo(Object o)
+ {
+ return getOrdinal() - ((Severity)o).getOrdinal();
+ }
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/NavigationCase.java b/api/src/main/java/jakarta/faces/application/NavigationCase.java
new file mode 100644
index 0000000..86b68f0
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/NavigationCase.java
@@ -0,0 +1,354 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
+import jakarta.faces.context.ExternalContext;
+import jakarta.faces.context.FacesContext;
+
+/**
+ * @since 2.0
+ */
+public class NavigationCase
+{
+ private String _condition;
+ private String _fromAction;
+ private String _fromOutcome;
+ private String _fromViewId;
+ private String _toViewId;
+ private String _toFlowDocumentId;
+ private boolean _includeViewParams;
+ private boolean _redirect;
+ private Map<String,List<String>> _parameters;
+
+ private ValueExpression _conditionExpression;
+ private ValueExpression _toViewIdExpression;
+
+ public NavigationCase(String fromViewId, String fromAction, String fromOutcome, String condition, String toViewId,
+ Map<String,List<String>> parameters, boolean redirect, boolean includeViewParams)
+ {
+ _condition = condition;
+ _fromViewId = fromViewId;
+ _fromAction = fromAction;
+ _fromOutcome = fromOutcome;
+ _toViewId = toViewId;
+ _toFlowDocumentId = null;
+ _redirect = redirect;
+ _includeViewParams = includeViewParams;
+ _parameters = parameters;
+ }
+
+ public NavigationCase(String fromViewId, String fromAction, String fromOutcome, String condition, String toViewId,
+ String toFlowDocumentId, Map<String,List<String>> parameters, boolean redirect,
+ boolean includeViewParams)
+ {
+ _condition = condition;
+ _fromViewId = fromViewId;
+ _fromAction = fromAction;
+ _fromOutcome = fromOutcome;
+ _toViewId = toViewId;
+ _toFlowDocumentId = toFlowDocumentId;
+ _redirect = redirect;
+ _includeViewParams = includeViewParams;
+ _parameters = parameters;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean equals(Object o)
+ {
+ if (o == this)
+ {
+ return true;
+ }
+ else if (o instanceof NavigationCase)
+ {
+ NavigationCase c = (NavigationCase) o;
+
+ return equals(_fromViewId, c._fromViewId) && equals(_fromAction, c._fromAction)
+ && equals(_fromOutcome, c._fromOutcome) && equals(_condition, c._condition)
+ && equals(_toViewId, c._toViewId) && _redirect == c._redirect
+ && _includeViewParams == c._includeViewParams;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode()
+ {
+ return hash(_fromViewId) << 4 ^ hash(_fromAction) << 8 ^ hash(_fromOutcome) << 12 ^ hash(_condition) << 16
+ ^ hash(_toViewId) << 20 ^ hash(Boolean.valueOf(_redirect)) << 24
+ ^ hash(Boolean.valueOf(_includeViewParams));
+ }
+
+ public URL getActionURL(FacesContext context) throws MalformedURLException
+ {
+ ExternalContext externalContext = context.getExternalContext();
+ return new URL(externalContext.getRequestScheme(), externalContext.getRequestServerName(),
+ externalContext.getRequestServerPort(),
+ context.getApplication().getViewHandler().getActionURL(context, getToViewId(context)));
+ }
+
+ public Boolean getCondition(FacesContext context)
+ {
+ if (_condition == null)
+ {
+ return null;
+ }
+
+ ValueExpression expression = _getConditionExpression(context);
+
+ return Boolean.TRUE.equals(expression.getValue(context.getELContext()));
+ }
+
+ public String getFromAction()
+ {
+ return _fromAction;
+ }
+
+ public String getFromOutcome()
+ {
+ return _fromOutcome;
+ }
+
+ public String getFromViewId()
+ {
+ return _fromViewId;
+ }
+
+ public URL getBookmarkableURL(FacesContext context) throws MalformedURLException
+ {
+ ExternalContext externalContext = context.getExternalContext();
+ return new URL(externalContext.getRequestScheme(),
+ externalContext.getRequestServerName(),
+ externalContext.getRequestServerPort(),
+ context.getApplication().getViewHandler().getBookmarkableURL(context, getToViewId(context),
+ _NavigationUtils.getEvaluatedNavigationParameters(context,
+ getParameters()), isIncludeViewParams()));
+ }
+
+ public URL getResourceURL(FacesContext context) throws MalformedURLException
+ {
+ ExternalContext externalContext = context.getExternalContext();
+ return new URL(externalContext.getRequestScheme(), externalContext.getRequestServerName(),
+ externalContext.getRequestServerPort(),
+ context.getApplication().getViewHandler().getResourceURL(context, getToViewId(context)));
+ }
+
+ public URL getRedirectURL(FacesContext context) throws MalformedURLException
+ {
+ ExternalContext externalContext = context.getExternalContext();
+ return new URL(externalContext.getRequestScheme(),
+ externalContext.getRequestServerName(),
+ externalContext.getRequestServerPort(),
+ context.getApplication().getViewHandler().getRedirectURL(context, getToViewId(context),
+ _NavigationUtils.getEvaluatedNavigationParameters(context,
+ getParameters()), isIncludeViewParams()));
+ }
+
+ public Map<String,List<String>> getParameters()
+ {
+ return _parameters;
+ }
+
+ public String getToViewId(FacesContext context)
+ {
+ if (_toViewId == null)
+ {
+ return null;
+ }
+
+ ValueExpression expression = _getToViewIdExpression(context);
+
+ return (String)( (expression.isLiteralText()) ?
+ expression.getExpressionString() : expression.getValue(context.getELContext()) );
+ }
+
+ public boolean hasCondition()
+ {
+ return _condition != null && _condition.length() > 0;
+ }
+
+ public boolean isIncludeViewParams()
+ {
+ return _includeViewParams;
+ }
+
+ public boolean isRedirect()
+ {
+ return _redirect;
+ }
+
+ /**
+ * @since 2.2
+ * @return
+ */
+ public String getToFlowDocumentId()
+ {
+ return _toFlowDocumentId;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder(128);
+ builder.append("<navigation-case>\n");
+
+ if (_fromViewId != null)
+ {
+ builder.append(" ");
+ builder.append("<from-view-id>");
+ builder.append(_fromViewId);
+ builder.append("</from-view-id>\n");
+ }
+
+ if (_fromAction != null)
+ {
+ builder.append(" ");
+ builder.append("<from-action>");
+ builder.append(_fromAction);
+ builder.append("</from-action>\n");
+ }
+
+ if (_fromOutcome != null)
+ {
+ builder.append(" ");
+ builder.append("<from-outcome>");
+ builder.append(_fromOutcome);
+ builder.append("</from-outcome>\n");
+ }
+
+ if (_condition != null)
+ {
+ builder.append(" ");
+ builder.append("<if>");
+ builder.append(_condition);
+ builder.append("</if>\n");
+ }
+
+ builder.append(" ");
+ builder.append("<to-view-id>");
+ builder.append(_toViewId);
+ builder.append("</to-view-id>\n");
+
+ if (_toFlowDocumentId != null)
+ {
+ builder.append(" ");
+ builder.append("<to-flow-document-id>");
+ builder.append(_toFlowDocumentId);
+ builder.append("</to-flow-document-id>\n");
+ }
+
+ if (_redirect)
+ {
+ builder.append(" ");
+ builder.append("<redirect include-view-params=\"");
+ builder.append(_includeViewParams);
+ if (_parameters != null && !_parameters.isEmpty())
+ {
+ builder.append("\">\n");
+ for (Map.Entry<String, List<String>> entry : _parameters.entrySet())
+ {
+ String name = entry.getKey();
+ for (String value : entry.getValue())
+ {
+ builder.append(" <view-param>\n");
+ builder.append(" <name>");
+ builder.append(name);
+ builder.append("</name>\n");
+ builder.append(" <value>");
+ builder.append(value);
+ builder.append("</value>\n");
+ builder.append(" </view-param>\n");
+ }
+ }
+ builder.append(" </redirect>\n");
+ }
+ else
+ {
+ builder.append("\"/>\n");
+ }
+ }
+
+ builder.append("</navigation-case>");
+
+ return builder.toString();
+ }
+
+ private ValueExpression _getConditionExpression(FacesContext context)
+ {
+ assert _condition != null;
+
+ if (_conditionExpression == null)
+ {
+ ExpressionFactory factory = context.getApplication().getExpressionFactory();
+ _conditionExpression = factory.createValueExpression(context.getELContext(), _condition, Boolean.class);
+ }
+
+ return _conditionExpression;
+ }
+
+ private ValueExpression _getToViewIdExpression(FacesContext context)
+ {
+ assert _toViewId != null;
+
+ if (_toViewIdExpression == null)
+ {
+ ExpressionFactory factory = context.getApplication().getExpressionFactory();
+ _toViewIdExpression = factory.createValueExpression(context.getELContext(), _toViewId, String.class);
+ }
+
+ return _toViewIdExpression;
+ }
+
+ private boolean equals(Object o1, Object o2)
+ {
+ if (o1 == null)
+ {
+ return o2 == null;
+ }
+ else
+ {
+ return o1.equals(o2);
+ }
+ }
+
+ private int hash(Object o)
+ {
+ return o == null ? 0 : o.hashCode();
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/NavigationCaseWrapper.java b/api/src/main/java/jakarta/faces/application/NavigationCaseWrapper.java
new file mode 100644
index 0000000..9c38e69
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/NavigationCaseWrapper.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.context.FacesContext;
+
+/**
+ * @since 2.2
+ */
+public abstract class NavigationCaseWrapper extends NavigationCase
+ implements FacesWrapper<NavigationCase>
+{
+ private NavigationCase delegate;
+
+ @Deprecated
+ public NavigationCaseWrapper()
+ {
+ super(null, null, null, null, null, null, false, false);
+ }
+
+ public NavigationCaseWrapper(NavigationCase delegate)
+ {
+ this();
+ this.delegate = delegate;
+ }
+
+ public boolean equals(Object o)
+ {
+ return getWrapped().equals(o);
+ }
+
+ public int hashCode()
+ {
+ return getWrapped().hashCode();
+ }
+
+ public URL getActionURL(FacesContext context) throws MalformedURLException
+ {
+ return getWrapped().getActionURL(context);
+ }
+
+ public Boolean getCondition(FacesContext context)
+ {
+ return getWrapped().getCondition(context);
+ }
+
+ public String getFromAction()
+ {
+ return getWrapped().getFromAction();
+ }
+
+ public String getFromOutcome()
+ {
+ return getWrapped().getFromOutcome();
+ }
+
+ public String getFromViewId()
+ {
+ return getWrapped().getFromViewId();
+ }
+
+ public URL getBookmarkableURL(FacesContext context) throws MalformedURLException
+ {
+ return getWrapped().getBookmarkableURL(context);
+ }
+
+ public URL getResourceURL(FacesContext context) throws MalformedURLException
+ {
+ return getWrapped().getResourceURL(context);
+ }
+
+ public URL getRedirectURL(FacesContext context) throws MalformedURLException
+ {
+ return getWrapped().getRedirectURL(context);
+ }
+
+ public Map<String, List<String>> getParameters()
+ {
+ return getWrapped().getParameters();
+ }
+
+ public String getToViewId(FacesContext context)
+ {
+ return getWrapped().getToViewId(context);
+ }
+
+ public boolean hasCondition()
+ {
+ return getWrapped().hasCondition();
+ }
+
+ public boolean isIncludeViewParams()
+ {
+ return getWrapped().isIncludeViewParams();
+ }
+
+ public boolean isRedirect()
+ {
+ return getWrapped().isRedirect();
+ }
+
+ public String getToFlowDocumentId()
+ {
+ return getWrapped().getToFlowDocumentId();
+ }
+
+ public String toString()
+ {
+ return getWrapped().toString();
+ }
+
+ public NavigationCase getWrapped()
+ {
+ return delegate;
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/NavigationHandler.java b/api/src/main/java/jakarta/faces/application/NavigationHandler.java
new file mode 100644
index 0000000..56fdeed
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/NavigationHandler.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import jakarta.faces.context.FacesContext;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public abstract class NavigationHandler
+{
+ public abstract void handleNavigation(FacesContext context,
+ String fromAction,
+ String outcome);
+
+ /**
+ * @since 2.2
+ * @param context
+ * @param fromAction
+ * @param outcome
+ * @param toFlowDocumentId
+ */
+ public void handleNavigation(FacesContext context,
+ String fromAction,
+ String outcome,
+ String toFlowDocumentId)
+ {
+ this.handleNavigation(context, fromAction, outcome);
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/NavigationHandlerWrapper.java b/api/src/main/java/jakarta/faces/application/NavigationHandlerWrapper.java
new file mode 100644
index 0000000..8246566
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/NavigationHandlerWrapper.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.context.FacesContext;
+
+/**
+ *
+ * @since 2.2
+ */
+public abstract class NavigationHandlerWrapper extends NavigationHandler
+ implements FacesWrapper<NavigationHandler>
+{
+
+ private NavigationHandler delegate;
+
+ @Deprecated
+ public NavigationHandlerWrapper()
+ {
+ }
+
+ public NavigationHandlerWrapper(NavigationHandler delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void handleNavigation(FacesContext context, String fromAction, String outcome)
+ {
+ getWrapped().handleNavigation(context, fromAction, outcome);
+ }
+
+ @Override
+ public void handleNavigation(FacesContext context,
+ String fromAction,
+ String outcome,
+ String toFlowDocumentId)
+ {
+ getWrapped().handleNavigation(context, fromAction, outcome, toFlowDocumentId);
+ }
+
+ public NavigationHandler getWrapped()
+ {
+ return delegate;
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/ProjectStage.java b/api/src/main/java/jakarta/faces/application/ProjectStage.java
new file mode 100644
index 0000000..abc0891
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ProjectStage.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+/**
+ * @since 2.0
+ */
+public enum ProjectStage
+{
+ Development,
+ Production,
+ SystemTest,
+ UnitTest;
+
+ public static final String PROJECT_STAGE_JNDI_NAME = "java:comp/env/jsf/ProjectStage";
+
+ /**
+ *
+ */
+ //@JSFWebConfigParam(defaultValue="Production",
+ // expectedValues="Development, Production, SystemTest, UnitTest",
+ // since="2.0")
+ public static final String PROJECT_STAGE_PARAM_NAME = "jakarta.faces.PROJECT_STAGE";
+}
diff --git a/api/src/main/java/jakarta/faces/application/ProtectedViewException.java b/api/src/main/java/jakarta/faces/application/ProtectedViewException.java
new file mode 100644
index 0000000..4cc2035
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ProtectedViewException.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import jakarta.faces.FacesException;
+
+public class ProtectedViewException extends FacesException
+{
+
+ public ProtectedViewException()
+ {
+ }
+
+ public ProtectedViewException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ public ProtectedViewException(String message)
+ {
+ super(message);
+ }
+
+ public ProtectedViewException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/Resource.java b/api/src/main/java/jakarta/faces/application/Resource.java
new file mode 100644
index 0000000..cfc9513
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/Resource.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+
+import jakarta.faces.context.FacesContext;
+
+/**
+ * @since 2.0
+ */
+public abstract class Resource extends ViewResource
+{
+ /**
+ * This constant is used as the key in the component attribute map of a composite component to
+ * associate the component with its <code>Resource</code> instance.
+ */
+ public static final String COMPONENT_RESOURCE_KEY = "jakarta.faces.application.Resource.ComponentResource";
+
+ private String _contentType;
+ private String _libraryName;
+ private String _resourceName;
+
+ public String getContentType()
+ {
+ return _contentType;
+ }
+
+ public abstract InputStream getInputStream() throws IOException;
+
+ public String getLibraryName()
+ {
+ return _libraryName;
+ }
+
+ public abstract String getRequestPath();
+
+ public String getResourceName()
+ {
+ return _resourceName;
+ }
+
+ public abstract Map<String, String> getResponseHeaders();
+
+ public abstract URL getURL();
+
+ public void setContentType(String contentType)
+ {
+ _contentType = contentType;
+ }
+
+ public void setLibraryName(String libraryName)
+ {
+ _libraryName = libraryName;
+ }
+
+ public void setResourceName(String resourceName)
+ {
+ if (resourceName == null)
+ {
+ throw new NullPointerException();
+ }
+ _resourceName = resourceName;
+ }
+
+ @Override
+ public String toString()
+ {
+ return getRequestPath();
+ }
+
+ public abstract boolean userAgentNeedsUpdate(FacesContext context);
+}
diff --git a/api/src/main/java/jakarta/faces/application/ResourceDependencies.java b/api/src/main/java/jakarta/faces/application/ResourceDependencies.java
new file mode 100644
index 0000000..1fa3c44
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ResourceDependencies.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface ResourceDependencies
+{
+ public ResourceDependency[] value();
+}
diff --git a/api/src/main/java/jakarta/faces/application/ResourceDependency.java b/api/src/main/java/jakarta/faces/application/ResourceDependency.java
new file mode 100644
index 0000000..a695481
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ResourceDependency.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Repeatable(ResourceDependencies.class)
+public @interface ResourceDependency
+{
+ public String library() default "";
+ public String name();
+ public String target() default "";
+}
diff --git a/api/src/main/java/jakarta/faces/application/ResourceHandler.java b/api/src/main/java/jakarta/faces/application/ResourceHandler.java
new file mode 100644
index 0000000..8f0b725
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ResourceHandler.java
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import jakarta.faces.context.FacesContext;
+
+import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
+
+/**
+ * @since 2.0
+ */
+public abstract class ResourceHandler
+{
+ public static final String LOCALE_PREFIX = "jakarta.faces.resource.localePrefix";
+ public static final String RESOURCE_EXCLUDES_DEFAULT_VALUE = ".class .jsp .jspx .properties .xhtml .groovy";
+
+ /**
+ * Space separated file extensions that will not be served by the default ResourceHandler implementation.
+ */
+ @JSFWebConfigParam(defaultValue=".class .jsp .jspx .properties .xhtml .groovy",since="2.0", group="resources")
+ public static final String RESOURCE_EXCLUDES_PARAM_NAME = "jakarta.faces.RESOURCE_EXCLUDES";
+ public static final String RESOURCE_IDENTIFIER = "/jakarta.faces.resource";
+
+ /**
+ * @since 2.2
+ */
+ public static final String RESOURCE_CONTRACT_XML = "jakarta.faces.contract.xml";
+
+ /**
+ * @since 2.2
+ */
+ public static final String WEBAPP_CONTRACTS_DIRECTORY_PARAM_NAME = "jakarta.faces.WEBAPP_CONTRACTS_DIRECTORY";
+
+ /**
+ * @since 2.2
+ */
+ public static final String WEBAPP_RESOURCES_DIRECTORY_PARAM_NAME = "jakarta.faces.WEBAPP_RESOURCES_DIRECTORY";
+
+ /**
+ * @since 2.3
+ */
+ public static final String JSF_SCRIPT_RESOURCE_NAME = "jsf.js";
+
+ /**
+ * @since 2.3
+ */
+ public static final String JSF_SCRIPT_LIBRARY_NAME = "jakarta.faces";
+
+ private final static String MYFACES_JS_RESOURCE_NAME = "oamSubmit.js";
+ private final static String MYFACES_JS_RESOURCE_NAME_UNCOMPRESSED = "oamSubmit-uncompressed.js";
+ private final static String RENDERED_RESOURCES_SET = "org.apache.myfaces.RENDERED_RESOURCES_SET";
+ private final static String MYFACES_LIBRARY_NAME = "org.apache.myfaces";
+ private final static String RENDERED_MYFACES_JS = "org.apache.myfaces.RENDERED_MYFACES_JS";
+
+ public abstract Resource createResource(String resourceName);
+
+ public abstract Resource createResource(String resourceName, String libraryName);
+
+ public abstract Resource createResource(String resourceName, String libraryName, String contentType);
+
+ public abstract String getRendererTypeForResourceName(String resourceName);
+
+ public abstract void handleResourceRequest(FacesContext context) throws IOException;
+
+ public abstract boolean isResourceRequest(FacesContext context);
+
+ public abstract boolean libraryExists(String libraryName);
+
+ /**
+ * @since 2.2
+ * @param resourceId
+ * @return
+ */
+ public Resource createResourceFromId(String resourceId)
+ {
+ return null;
+ }
+
+ /**
+ *
+ * @since 2.2
+ * @param context
+ * @param resourceName
+ * @return
+ */
+ public ViewResource createViewResource(FacesContext context,
+ String resourceName)
+ {
+ return context.getApplication().getResourceHandler().createResource(resourceName);
+ }
+
+ public boolean isResourceURL(java.lang.String url)
+ {
+ if (url == null)
+ {
+ throw new NullPointerException();
+ }
+ return url.contains(RESOURCE_IDENTIFIER);
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param path
+ * @param options
+ * @return
+ */
+ public Stream<java.lang.String> getViewResources(
+ FacesContext facesContext, String path, ResourceVisitOption... options)
+ {
+ return getViewResources(facesContext, path, Integer.MAX_VALUE, options);
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param path
+ * @param maxDepth
+ * @param options
+ * @return
+ */
+ public Stream<java.lang.String> getViewResources(FacesContext facesContext,
+ String path, int maxDepth, ResourceVisitOption... options)
+ {
+ return null;
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param resourceName
+ * @param libraryName
+ * @return
+ */
+ public boolean isResourceRendered(FacesContext facesContext, String resourceName, String libraryName)
+ {
+ return getRenderedResources(facesContext).containsKey(
+ libraryName != null ? libraryName+'/'+resourceName : resourceName);
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param resourceName
+ * @param libraryName
+ */
+ public void markResourceRendered(FacesContext facesContext, String resourceName, String libraryName)
+ {
+ getRenderedResources(facesContext).put(
+ libraryName != null ? libraryName+'/'+resourceName : resourceName, Boolean.TRUE);
+ if (ResourceHandler.JSF_SCRIPT_LIBRARY_NAME.equals(libraryName) &&
+ ResourceHandler.JSF_SCRIPT_RESOURCE_NAME.equals(resourceName))
+ {
+ // If we are calling this method, it is expected myfaces core is being used as runtime and note
+ // oamSubmit script is included inside jsf.js, so mark this one too.
+ getRenderedResources(facesContext).put(
+ MYFACES_LIBRARY_NAME+'/'+MYFACES_JS_RESOURCE_NAME, Boolean.TRUE);
+ }
+ }
+
+ /**
+ * Return a set of already rendered resources by this renderer on the current
+ * request.
+ *
+ * @param facesContext
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ private static Map<String, Boolean> getRenderedResources(FacesContext facesContext)
+ {
+ Map<String, Boolean> map = (Map<String, Boolean>) facesContext.getViewRoot().getTransientStateHelper()
+ .getTransient(RENDERED_RESOURCES_SET);
+ if (map == null)
+ {
+ map = new HashMap<String, Boolean>();
+ facesContext.getViewRoot().getTransientStateHelper().putTransient(RENDERED_RESOURCES_SET,map);
+ }
+ return map;
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/ResourceHandlerWrapper.java b/api/src/main/java/jakarta/faces/application/ResourceHandlerWrapper.java
new file mode 100644
index 0000000..9f4ad5d
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ResourceHandlerWrapper.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.util.stream.Stream;
+
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.context.FacesContext;
+
+/**
+ * @since 2.0
+ */
+public abstract class ResourceHandlerWrapper extends ResourceHandler
+ implements FacesWrapper<ResourceHandler>
+{
+ private ResourceHandler delegate;
+
+ @Deprecated
+ public ResourceHandlerWrapper()
+ {
+ }
+
+ public ResourceHandlerWrapper(ResourceHandler delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public Resource createResource(String resourceName)
+ {
+ return getWrapped().createResource(resourceName);
+ }
+
+ @Override
+ public Resource createResource(String resourceName, String libraryName)
+ {
+ return getWrapped().createResource(resourceName, libraryName);
+ }
+
+ @Override
+ public Resource createResource(String resourceName, String libraryName, String contentType)
+ {
+ return getWrapped().createResource(resourceName, libraryName, contentType);
+ }
+
+ @Override
+ public String getRendererTypeForResourceName(String resourceName)
+ {
+ return getWrapped().getRendererTypeForResourceName(resourceName);
+ }
+
+ @Override
+ public void handleResourceRequest(FacesContext context) throws IOException
+ {
+ getWrapped().handleResourceRequest(context);
+ }
+
+ @Override
+ public boolean isResourceRequest(FacesContext context)
+ {
+ return getWrapped().isResourceRequest(context);
+ }
+
+ @Override
+ public boolean libraryExists(String libraryName)
+ {
+ return getWrapped().libraryExists(libraryName);
+ }
+
+ @Override
+ public Resource createResourceFromId(String resourceId)
+ {
+ return getWrapped().createResourceFromId(resourceId);
+ }
+
+ @Override
+ public ViewResource createViewResource(FacesContext context, String resourceName)
+ {
+ return getWrapped().createViewResource(context, resourceName);
+ }
+
+ @Override
+ public boolean isResourceURL(String url)
+ {
+ return getWrapped().isResourceURL(url);
+ }
+
+ public ResourceHandler getWrapped()
+ {
+ return delegate;
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param path
+ * @param maxDepth
+ * @param options
+ * @return
+ */
+ @Override
+ public Stream<String> getViewResources(
+ FacesContext facesContext, String path, int maxDepth, ResourceVisitOption... options)
+ {
+ return getWrapped().getViewResources(facesContext, path, maxDepth, options);
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param path
+ * @param options
+ * @return
+ */
+ @Override
+ public Stream<String> getViewResources(FacesContext facesContext, String path, ResourceVisitOption... options)
+ {
+ return getWrapped().getViewResources(facesContext, path, options);
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param resourceName
+ * @param libraryName
+ */
+ @Override
+ public void markResourceRendered(FacesContext facesContext, String resourceName, String libraryName)
+ {
+ getWrapped().markResourceRendered(facesContext, resourceName, libraryName);
+ }
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param resourceName
+ * @param libraryName
+ * @return
+ */
+ @Override
+ public boolean isResourceRendered(FacesContext facesContext, String resourceName, String libraryName)
+ {
+ return getWrapped().isResourceRendered(facesContext, resourceName, libraryName);
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/ResourceVisitOption.java b/api/src/main/java/jakarta/faces/application/ResourceVisitOption.java
new file mode 100644
index 0000000..114a1ba
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ResourceVisitOption.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.application;
+
+/**
+ *
+ */
+public enum ResourceVisitOption
+{
+ TOP_LEVEL_VIEWS_ONLY
+}
diff --git a/api/src/main/java/jakarta/faces/application/ResourceWrapper.java b/api/src/main/java/jakarta/faces/application/ResourceWrapper.java
new file mode 100644
index 0000000..4f275d1
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ResourceWrapper.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.context.FacesContext;
+
+/**
+ * @since 2.0
+ */
+public abstract class ResourceWrapper extends Resource
+ implements FacesWrapper<Resource>
+{
+ private Resource delegate;
+
+ @Deprecated
+ public ResourceWrapper()
+ {
+ }
+
+ public ResourceWrapper(Resource delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException
+ {
+ return getWrapped().getInputStream();
+ }
+
+ @Override
+ public String getRequestPath()
+ {
+ return getWrapped().getRequestPath();
+ }
+
+ @Override
+ public Map<String, String> getResponseHeaders()
+ {
+ return getWrapped().getResponseHeaders();
+ }
+
+ @Override
+ public URL getURL()
+ {
+ return getWrapped().getURL();
+ }
+
+ @Override
+ public boolean userAgentNeedsUpdate(FacesContext context)
+ {
+ return getWrapped().userAgentNeedsUpdate(context);
+ }
+
+ public Resource getWrapped()
+ {
+ return delegate;
+ }
+
+ @Override
+ public void setResourceName(String resourceName)
+ {
+ getWrapped().setResourceName(resourceName);
+ }
+
+ @Override
+ public void setLibraryName(String libraryName)
+ {
+ getWrapped().setLibraryName(libraryName);
+ }
+
+ @Override
+ public void setContentType(String contentType)
+ {
+ getWrapped().setContentType(contentType);
+ }
+
+ @Override
+ public String getResourceName()
+ {
+ return getWrapped().getResourceName();
+ }
+
+ @Override
+ public String getLibraryName()
+ {
+ return getWrapped().getLibraryName();
+ }
+
+ @Override
+ public String getContentType()
+ {
+ return getWrapped().getContentType();
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/StateManager.java b/api/src/main/java/jakarta/faces/application/StateManager.java
new file mode 100644
index 0000000..76f866f
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/StateManager.java
@@ -0,0 +1,352 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+
+import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
+
+import java.io.IOException;
+
+import jakarta.faces.component.UIViewRoot;
+import jakarta.faces.context.FacesContext;
+
+/**
+ * Responsible for storing sufficient information about a component tree so that an identical tree can later be
+ * recreated.
+ * <p>
+ * It is up to the concrete implementation to decide whether to use information from the "view template" that was used
+ * to first create the view, or whether to store sufficient information to enable the view to be restored without any
+ * reference to the original template. However as JSF components have mutable fields that can be set by code, and
+ * affected by user input, at least some state does need to be kept in order to recreate a previously-existing component
+ * tree.
+ * <p>
+ * There are two different options defined by the specification: "client" and "server" state.
+ * <p>
+ * When "client" state is configured, all state information required to create the tree is embedded within the data
+ * rendered to the client. Note that because data received from a remote client must always be treated as "tainted",
+ * care must be taken when using such data. Some StateManager implementations may use encryption to ensure that clients
+ * cannot modify the data, and that the data received on postback is therefore trustworthy.
+ * <p>
+ * When "server" state is configured, the data is saved somewhere "on the back end", and (at most) a token is embedded
+ * in the data rendered to the user.
+ * <p>
+ * This class is usually invoked by a concrete implementation of ViewHandler.
+ * <p>
+ * Note that class ViewHandler isolates JSF components from the details of the request format. This class isolates JSF
+ * components from the details of the response format. Because request and response are usually tightly coupled, the
+ * StateManager and ViewHandler implementations are also usually fairly tightly coupled (ie the ViewHandler/StateManager
+ * implementations come as pairs).
+ * <p>
+ * See also the <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public abstract class StateManager
+{
+ /**
+ * Define the state method to be used. There are two different options defined by the
+ * specification: "client" and "server" state.
+ * <p>
+ * When "client" state is configured, all state information required to create the tree is embedded within
+ * the data rendered to the client. Note that because data received from a remote client must always be
+ * treated as "tainted", care must be taken when using such data. Some StateManager implementations may
+ * use encryption to ensure that clients cannot modify the data, and that the data received on postback
+ * is therefore trustworthy.
+ * </p>
+ * <p>
+ * When "server" state is configured, the data is saved somewhere "on the back end", and (at most) a
+ * token is embedded in the data rendered to the user.
+ * </p>
+ */
+ @JSFWebConfigParam(defaultValue="server", expectedValues="server,client",
+ since="1.1", group="state", tags="performance", ignoreUpperLowerCase = true,
+ desc="Define the state method to be used. There are two different options "
+ + "defined by the specification: 'client' and 'server' state.")
+ public static final String STATE_SAVING_METHOD_PARAM_NAME = "jakarta.faces.STATE_SAVING_METHOD";
+ public static final String STATE_SAVING_METHOD_CLIENT = "client";
+ public static final String STATE_SAVING_METHOD_SERVER = "server";
+
+ /**
+ * Indicate the viewId(s) separated by commas that should be saved and restored fully,
+ * without use Partial State Saving (PSS).
+ */
+ @JSFWebConfigParam(since="2.0", group="state")
+ public static final String FULL_STATE_SAVING_VIEW_IDS_PARAM_NAME = "jakarta.faces.FULL_STATE_SAVING_VIEW_IDS";
+
+ /**
+ * Enable or disable partial state saving algorithm.
+ *
+ * <p>Partial State Saving algorithm allows to reduce the size of the state required to save a view,
+ * keeping track of the "delta" or differences between the view build by first time and the current
+ * state of the view.</p>
+ * <p>If the webapp faces-config file version is 2.0 or upper the default value is true, otherwise is false.</p>
+ */
+ @JSFWebConfigParam(expectedValues="true,false", since="2.0", defaultValue="true (false with 1.2 webapps)",
+ tags="performance", group="state")
+ public static final String PARTIAL_STATE_SAVING_PARAM_NAME = "jakarta.faces.PARTIAL_STATE_SAVING";
+ private Boolean _savingStateInClient = null;
+
+ public static final String IS_BUILDING_INITIAL_STATE = "jakarta.faces.IS_BUILDING_INITIAL_STATE";
+
+ public static final String IS_SAVING_STATE = "jakarta.faces.IS_SAVING_STATE";
+
+ /**
+ * Indicate if the state should be serialized before save it on the session.
+ * <p>
+ * Only applicable if state saving method is "server" (= default).
+ * If <code>true</code> (default) the state will be serialized to a byte stream before it is
+ * written to the session.
+ * If <code>false</code> the state will not be serialized to a byte stream.
+ * </p>
+ */
+ @JSFWebConfigParam(since="2.2", group="state", tags="performance",
+ defaultValue="false", expectedValues="true,false")
+ public static final java.lang.String SERIALIZE_SERVER_STATE_PARAM_NAME = "jakarta.faces.SERIALIZE_SERVER_STATE";
+
+ /**
+ * Invokes getTreeStructureToSave and getComponentStateToSave, then return an object that wraps the two resulting
+ * objects. This object can then be passed to method writeState.
+ * <p>
+ * Deprecated; use saveView instead.
+ *
+ * @deprecated
+ */
+ public StateManager.SerializedView saveSerializedView(FacesContext context)
+ {
+ Object savedView = saveView(context);
+ if (savedView != null && savedView instanceof Object[])
+ {
+ Object[] structureAndState = (Object[]) savedView;
+ if (structureAndState.length == 2)
+ {
+ return new StateManager.SerializedView(structureAndState[0], structureAndState[1]);
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns an object that is sufficient to recreate the component tree that is the viewroot of the specified
+ * context.
+ * <p>
+ * The return value is suitable for passing to method writeState.
+ *
+ * @since 1.2
+ */
+ @Deprecated
+ public Object saveView(FacesContext context)
+ {
+ StateManager.SerializedView serializedView = saveSerializedView(context);
+ if (serializedView == null)
+ {
+ return null;
+ }
+
+ Object[] structureAndState = new Object[2];
+ structureAndState[0] = serializedView.getStructure();
+ structureAndState[1] = serializedView.getState();
+
+ return structureAndState;
+ }
+
+ /**
+ * Return data that is sufficient to recreate the component tree that is the viewroot of the specified context, but
+ * without restoring the state in the components.
+ * <p>
+ * Using this data, a tree of components which has the same "shape" as the original component tree can be recreated.
+ * However the component instances themselves will have only their default values, ie their member fields will not
+ * have been set to the original values.
+ * <p>
+ * Deprecated; use saveView instead.
+ *
+ * @deprecated
+ */
+ protected Object getTreeStructureToSave(FacesContext context)
+ {
+ return null;
+ }
+
+ /**
+ * Return data that can be applied to a component tree created using the "getTreeStructureToSave" method.
+ * <p>
+ * Deprecated; use saveView instead.
+ *
+ * @deprecated
+ */
+ protected Object getComponentStateToSave(FacesContext context)
+ {
+ return null;
+ }
+
+ /**
+ * Associate the provided state object with the current response being generated.
+ * <p>
+ * When client-side state is enabled, it is expected that method writes the data contained in the state parameter to
+ * the response somehow.
+ * <p>
+ * When server-side state is enabled, at most a "token" is expected to be written.
+ * <p>
+ * Deprecated; use writeState(FacesContext, Object) instead. This method was abstract in JSF1.1, but is now an empty
+ * non-abstract method so that old classes that implement this method continue to work, while new classes can just
+ * override the new writeState method rather than this one.
+ *
+ * @throws IOException
+ * never
+ *
+ * @deprecated
+ */
+ public void writeState(FacesContext context, StateManager.SerializedView state)
+ throws IOException
+ {
+ if (state != null)
+ {
+ writeState(context, new Object[]{state.getStructure(), state.getState()});
+ }
+ }
+
+ /**
+ * Associate the provided state object with the current response being generated.
+ * <p>
+ * When client-side state is enabled, it is expected that method writes the data contained in the state parameter to
+ * the response somehow.
+ * <p>
+ * When server-side state is enabled, at most a "token" is expected to be written.
+ * <p>
+ * This method should be overridden by subclasses. It is not abstract because a default implementation is provided
+ * that forwards to the old writeState method; this allows subclasses of StateManager written using the JSF1.1 API
+ * to continue to work.
+ * <p>
+ *
+ * @since 1.2
+ */
+ public void writeState(FacesContext context, Object state) throws IOException
+ {
+ if (!(state instanceof Object[]))
+ {
+ return;
+ }
+ Object[] structureAndState = (Object[]) state;
+ if (structureAndState.length < 2)
+ {
+ return;
+ }
+
+ writeState(context, new StateManager.SerializedView(structureAndState[0], structureAndState[1]));
+ }
+
+ /**
+ * TODO: This method should be called from somewhere when ajax response is created to update the state saving param
+ * on client. The place where this method is called is an implementation detail, so there is no references about
+ * from where in the spec javadoc.
+ *
+ * @since 2.0
+ * @param context
+ * @return
+ */
+ public String getViewState(FacesContext context)
+ {
+ return context.getRenderKit().getResponseStateManager().getViewState(context, saveView(context));
+ }
+
+ @Deprecated
+ public abstract UIViewRoot restoreView(FacesContext context, String viewId, String renderKitId);
+
+ /**
+ * @deprecated
+ */
+ protected UIViewRoot restoreTreeStructure(FacesContext context, String viewId, String renderKitId)
+ {
+ return null;
+ }
+
+ /**
+ * @deprecated
+ */
+ protected void restoreComponentState(FacesContext context, UIViewRoot viewRoot, String renderKitId)
+ {
+ // default impl does nothing as per JSF 1.2 javadoc
+ }
+
+ public boolean isSavingStateInClient(FacesContext context)
+ {
+ if (context == null)
+ {
+ throw new NullPointerException("context");
+ }
+ if (_savingStateInClient != null)
+ {
+ return _savingStateInClient.booleanValue();
+ }
+
+ String stateSavingMethod = context.getExternalContext().getInitParameter(STATE_SAVING_METHOD_PARAM_NAME);
+ if (stateSavingMethod == null)
+ {
+ _savingStateInClient = Boolean.FALSE; // Specs 10.1.3: default server saving
+ context.getExternalContext().log("No state saving method defined, assuming default server state saving");
+ }
+ else if (stateSavingMethod.equalsIgnoreCase(STATE_SAVING_METHOD_CLIENT))
+ {
+ _savingStateInClient = Boolean.TRUE;
+ }
+ else if (stateSavingMethod.equalsIgnoreCase(STATE_SAVING_METHOD_SERVER))
+ {
+ _savingStateInClient = Boolean.FALSE;
+ }
+ else
+ {
+ _savingStateInClient = Boolean.FALSE; // Specs 10.1.3: default server saving
+ context.getExternalContext().log(
+ "Illegal state saving method '" + stateSavingMethod + "', default server state saving will be used");
+ }
+ return _savingStateInClient.booleanValue();
+ }
+
+ /**
+ * @deprecated
+ */
+ public class SerializedView
+ {
+ private Object _structure;
+ private Object _state;
+
+ /**
+ * @deprecated
+ */
+ public SerializedView(Object structure, Object state)
+ {
+ _structure = structure;
+ _state = state;
+ }
+
+ /**
+ * @deprecated
+ */
+ public Object getStructure()
+ {
+ return _structure;
+ }
+
+ /**
+ * @deprecated
+ */
+ public Object getState()
+ {
+ return _state;
+ }
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/StateManagerWrapper.java b/api/src/main/java/jakarta/faces/application/StateManagerWrapper.java
new file mode 100644
index 0000000..d2db883
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/StateManagerWrapper.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.application;
+
+import java.io.IOException;
+import jakarta.faces.component.UIViewRoot;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.FacesWrapper;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/j2ee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public abstract class StateManagerWrapper extends StateManager implements FacesWrapper<StateManager>
+{
+ private StateManager delegate;
+
+ @Deprecated
+ public StateManagerWrapper()
+ {
+ }
+
+ public StateManagerWrapper(StateManager delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public StateManager getWrapped()
+ {
+ return delegate;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public StateManager.SerializedView saveSerializedView(FacesContext context)
+ {
+ return getWrapped().saveSerializedView(context);
+ }
+
+ @Override
+ public Object saveView(FacesContext context)
+ {
+ return getWrapped().saveView(context);
+ }
+
+ @Override
+ public boolean isSavingStateInClient(FacesContext context)
+ {
+ return getWrapped().isSavingStateInClient(context);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected Object getTreeStructureToSave(FacesContext context)
+ {
+ return getWrapped().getTreeStructureToSave(context);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected Object getComponentStateToSave(FacesContext context)
+ {
+ return getWrapped().getComponentStateToSave(context);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void writeState(FacesContext context, StateManager.SerializedView state) throws IOException
+ {
+ getWrapped().writeState(context, state);
+ }
+
+ @Override
+ public void writeState(FacesContext context, Object state) throws IOException
+ {
+ getWrapped().writeState(context, state);
+ }
+
+ @Override
+ public UIViewRoot restoreView(FacesContext context, String viewId, String renderKitId)
+ {
+ return getWrapped().restoreView(context, viewId, renderKitId);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected UIViewRoot restoreTreeStructure(FacesContext context, String viewId, String renderKitId)
+ {
+ return getWrapped().restoreTreeStructure(context, viewId, renderKitId);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected void restoreComponentState(FacesContext context, UIViewRoot viewRoot, String renderKitId)
+ {
+ getWrapped().restoreComponentState(context, viewRoot, renderKitId);
+ }
+
+ @Override
+ public String getViewState(FacesContext context)
+ {
+ return getWrapped().getViewState(context);
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/ViewExpiredException.java b/api/src/main/java/jakarta/faces/application/ViewExpiredException.java
new file mode 100644
index 0000000..ed6780b
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ViewExpiredException.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.application;
+
+import jakarta.faces.FacesException;
+
+/**
+ * See Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public class ViewExpiredException extends FacesException
+{
+
+ private String viewId;
+
+ public ViewExpiredException()
+ {
+ }
+
+ public ViewExpiredException(String viewId)
+ {
+ this.viewId = viewId;
+ }
+
+ public ViewExpiredException(String message, String viewId)
+ {
+ super(message);
+ this.viewId = viewId;
+ }
+
+ public ViewExpiredException(String message, Throwable cause, String viewId)
+ {
+ super(message, cause);
+ this.viewId = viewId;
+ }
+
+ public ViewExpiredException(Throwable cause, String viewId)
+ {
+ super(cause);
+ this.viewId = viewId;
+ }
+
+ public String getViewId()
+ {
+ return viewId;
+ }
+}
diff --git a/api/src/main/java/jakarta/faces/application/ViewHandler.java b/api/src/main/java/jakarta/faces/application/ViewHandler.java
new file mode 100644
index 0000000..8735a3f
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ViewHandler.java
@@ -0,0 +1,450 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import jakarta.faces.FacesException;
+import jakarta.faces.component.UIViewRoot;
+import jakarta.faces.context.ExternalContext;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.view.ViewDeclarationLanguage;
+
+import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
+
+/**
+ * A ViewHandler manages the component-tree-creation and component-tree-rendering parts of a request lifecycle (ie
+ * "create view", "restore view" and "render response").
+ * <p>
+ * A ViewHandler is responsible for generating the component tree when a new view is requested; see method "createView".
+ * <p>
+ * When the user performs a "postback", ie activates a UICommand component within a view, then the ViewHandler is
+ * responsible for recreating a view tree identical to the one used previously to render that view; see method
+ * "restoreView".
+ * <p>
+ * And the ViewHandler is also responsible for rendering the final output to be sent to the user by invoking the
+ * rendering methods on components; see method "renderView".
+ * <p>
+ * This class also isolates callers from the underlying request/response system. In particular, this class does not
+ * explicitly depend upon the javax.servlet apis. This allows JSF to be used on servers that do not implement the
+ * servlet API (for example, plain CGI).
+ * <p>
+ * Examples:
+ * <ul>
+ * <li>A JSP ViewHandler exists for using "jsp" pages as the presentation technology. This class then works together
+ * with a taghandler class and a jsp servlet class to implement the methods on this abstract class definition.
+ * <li>A Facelets ViewHandler instead uses an xml file to define the components and non-component data that make up a
+ * specific view.
+ * </ul>
+ * Of course there is no reason why the "template" needs to be a textual file. A view could be generated based on data
+ * in a database, or many other mechanisms.
+ * <p>
+ * This class is expected to be invoked via the concrete implementation of {@link jakarta.faces.lifecycle.Lifecycle}.
+ * <p>
+ * For the official specification for this class, see <a
+ * href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>.
+ */
+public abstract class ViewHandler
+{
+ public static final String CHARACTER_ENCODING_KEY = "jakarta.faces.request.charset";
+ public static final String DEFAULT_FACELETS_SUFFIX = ".xhtml";
+ public static final String DEFAULT_SUFFIX = ".xhtml .view.xml .jsp";
+
+ /**
+ * Indicate the default suffixes, separated by spaces to derive the default file URI
+ * used by JSF to create views and render pages.
+ */
+ @JSFWebConfigParam(defaultValue=".xhtml .view.xml .jsp", since="1.1", group="viewhandler")
+ public static final String DEFAULT_SUFFIX_PARAM_NAME = "jakarta.faces.DEFAULT_SUFFIX";
+
+ /**
+ * The default extension used to handle facelets pages.
+ */
+ @JSFWebConfigParam(defaultValue=".xhtml", since="2.0", group="viewhandler")
+ public static final String FACELETS_SUFFIX_PARAM_NAME = "jakarta.faces.FACELETS_SUFFIX";
+
+ /**
+ * Set of extensions handled by facelets, separated by ';'.
+ */
+ @JSFWebConfigParam(since="2.0", group="viewhandler")
+ public static final String FACELETS_VIEW_MAPPINGS_PARAM_NAME = "jakarta.faces.FACELETS_VIEW_MAPPINGS";
+ // TODO: Notify EG on that last constant. Using the Facelets' param as well for backward compatiblity is
+ // silly. If an application uses Facelets then they'll be using facelets.jar. Once they chose to
+ // remove that JAR, they ought to be aware that some changes could be needed, like fixing their
+ // context-param. -= Simon Lessard =-
+
+ @JSFWebConfigParam(since="2.2")
+ public static final java.lang.String DISABLE_FACELET_JSF_VIEWHANDLER_PARAM_NAME =
+ "jakarta.faces.DISABLE_FACELET_JSF_VIEWHANDLER";
+
+ /**
+ * Define the default buffer size value passed to ExternalContext.setResponseBufferResponse() and in a
+ * servlet environment to HttpServletResponse.setBufferSize().
+ */
+ @JSFWebConfigParam(since = "2.0", alias = "facelets.BUFFER_SIZE", classType = "java.lang.Integer",
+ tags = "performance", defaultValue="1024",
+ desc = "Define the default buffer size value passed to ExternalContext.setResponseBufferResponse() and in "
+ + "a servlet environment to HttpServletResponse.setBufferSize()")
+ public static final java.lang.String FACELETS_BUFFER_SIZE_PARAM_NAME = "jakarta.faces.FACELETS_BUFFER_SIZE";
+
+ /**
+ * Set of class names, separated by ';', implementing TagDecorator interface, used to transform
+ * a view definition in a facelet abstract syntax tree, that is used later to generate a component tree.
+ */
+ @JSFWebConfigParam(since = "2.0", alias = "facelets.DECORATORS")
+ public static final java.lang.String FACELETS_DECORATORS_PARAM_NAME = "jakarta.faces.FACELETS_DECORATORS";
+
+ /**
+ * Set of .taglib.xml files, separated by ';' that should be loaded by facelet engine.
+ */
+ @JSFWebConfigParam(since = "2.0",
+ desc = "Set of .taglib.xml files, separated by ';' that should be loaded by facelet engine.",
+ alias = "facelets.LIBRARIES")
+ public static final java.lang.String FACELETS_LIBRARIES_PARAM_NAME = "jakarta.faces.FACELETS_LIBRARIES";
+
+ /**
+ * Define the period used to refresh the facelet abstract syntax tree from the view definition file.
+ *
+ * <p>By default is infinite (no active).</p>
+ */
+ @JSFWebConfigParam(since = "2.0", defaultValue = "-1", alias = "facelets.REFRESH_PERIOD",
+ classType = "java.lang.Long", tags = "performance")
+ public static final java.lang.String FACELETS_REFRESH_PERIOD_PARAM_NAME = "jakarta.faces.FACELETS_REFRESH_PERIOD";
+
+ /**
+ * Skip comments found on a facelet file.
+ */
+ @JSFWebConfigParam(since = "2.0", alias = "facelets.SKIP_COMMENTS")
+ public static final java.lang.String FACELETS_SKIP_COMMENTS_PARAM_NAME = "jakarta.faces.FACELETS_SKIP_COMMENTS";
+
+ /**
+ * @since JSF 1.2
+ */
+ public String calculateCharacterEncoding(FacesContext context)
+ {
+ String encoding = null;
+ ExternalContext externalContext = context.getExternalContext();
+ String contentType = externalContext.getRequestHeaderMap().get("Content-Type");
+ int indexOf = contentType == null ? -1 : contentType.indexOf("charset");
+ if (indexOf != -1)
+ {
+ String tempEnc = contentType.substring(indexOf); // charset=UTF-8
+ encoding = tempEnc.substring(tempEnc.indexOf('=') + 1); // UTF-8
+ if (encoding.length() == 0)
+ {
+ encoding = null;
+ }
+ }
+ if (encoding == null)
+ {
+ boolean sessionAvailable = externalContext.getSession(false) != null;
+ if (sessionAvailable)
+ {
+ Object sessionParam = externalContext.getSessionMap().get(CHARACTER_ENCODING_KEY);
+ if (sessionParam != null)
+ {
+ encoding = sessionParam.toString();
+ }
+ }
+ }
+
+ return encoding;
+ }
+
+ /**
+ * Return the Locale object that should be used when rendering this view to the current user.
+ * <p>
+ * Some request protocols allow an application user to specify what locale they prefer the response to be in. For
+ * example, HTTP requests can specify the "accept-language" header.
+ * <p>
+ * Method {@link Application#getSupportedLocales()} defines what locales this JSF
+ * application is capable of supporting.
+ * <p>
+ * This method should match such sources of data up and return the Locale object that is the best choice for
+ * rendering the current application to the current user.
+ */
+ public abstract Locale calculateLocale(FacesContext context);
+
+ /**
+ * Return the id of an available render-kit that should be used to map the JSF components into user presentation.
+ * <p>
+ * The render-kit selected (eg html, xhtml, pdf, xul, ...) may depend upon the user, properties associated with the
+ * request, etc.
+ */
+ public abstract String calculateRenderKitId(FacesContext context);
+
+ /**
+ * Build a root node for a component tree.
+ * <p>
+ * When a request is received, this method is called if restoreView returns null, ie this is not a "postback". In
+ * this case, a root node is created and then renderView is invoked. It is the responsibility of the renderView
+ * method to build the full component tree (ie populate the UIViewRoot with descendant nodes).
+ * <p>
+ * This method is also invoked when navigation occurs from one view to another, where the viewId passed is the id of
+ * the new view to be displayed. Again it is the responsibility of renderView to then populate the viewroot with
+ * descendants.
+ * <p>
+ * The locale and renderKit settings are inherited from the current UIViewRoot that is configured before this method
+ * is called. That means of course that they do NOT get set for GET requests, including navigation that has the
+ * redirect flag set.
+ */
+ public abstract UIViewRoot createView(FacesContext context, String viewId);
+
+ /**
+ * @param context
+ * @param input
+ * @return
+ *
+ * @since 2.0
+ */
+ public String deriveViewId(FacesContext context, String input)
+ {
+ //The default implementation of this method simply returns rawViewId unchanged.
+ return input;
+ }
+
+ /**
+ *
+ * @param context
+ * @param rawViewId
+ * @return
+ * @since 2.1
+ */
+ public String deriveLogicalViewId(FacesContext context, String rawViewId)
+ {
+ return rawViewId;
+ }
+
+ /**
+ * Returns a URL, suitable for encoding and rendering, that (if activated) will cause the JSF
+ * request processing lifecycle for the specified viewId to be executed
+ */
+ public abstract String getActionURL(FacesContext context, String viewId);
+
+ /**
+ * Return a JSF action URL derived from the viewId argument that is suitable to be used as
+ * the target of a link in a JSF response. Compiliant implementations must implement this method
+ * as specified in section JSF.7.5.2. The default implementation simply calls through to
+ * getActionURL(jakarta.faces.context.FacesContext, java.lang.String), passing the arguments context and viewId.
+ *
+ * @param context
+ * @param viewId
+ * @param parameters
+ * @param includeViewParams
+ * @return
+ *
+ * @since 2.0
+ */
+ public String getBookmarkableURL(FacesContext context, String viewId, Map<String, List<String>> parameters,
+ boolean includeViewParams)
+ {
+ return getActionURL(context, viewId);
+ }
+
+ /**
+ * Return the ViewDeclarationLanguage instance used for this ViewHandler instance.
+ * <P>
+ * The default implementation of this method returns null.
+ *
+ * @param context
+ * @param viewId
+ * @return
+ *
+ * @since 2.0
+ */
+ public ViewDeclarationLanguage getViewDeclarationLanguage(FacesContext context, String viewId)
+ {
+ // TODO: In some places like RestoreViewExecutor, we are calling deriveViewId
+ // TODO: after call restoreViewSupport.calculateViewId
+ // Maybe this method should be called from here, because it is supposed that
+ // calculateViewId "calculates the view id!"
+
+ // here we return null to support pre jsf 2.0 ViewHandlers (e.g. com.sun.facelets.FaceletViewHandler),
+ // because they don't provide any ViewDeclarationLanguage,
+ // but in the default implementation (ViewHandlerImpl) we return vdlFactory.getViewDeclarationLanguage(viewId)
+ return null;
+ }
+
+ /**
+ * Return a JSF action URL derived from the viewId argument that is suitable to be used by
+ * the NavigationHandler to issue a redirect request to the URL using a NonFaces request.
+ * Compiliant implementations must implement this method as specified in section JSF.7.5.2.
+ * The default implementation simply calls through to
+ * getActionURL(jakarta.faces.context.FacesContext, java.lang.String), passing the arguments context and viewId.
+ *
+ * @param context
+ * @param viewId
+ * @param parameters
+ * @param includeViewParams
+ * @return
+ *
+ * @since 2.0
+ */
+ public String getRedirectURL(FacesContext context, String viewId, Map<String, List<String>> parameters,
+ boolean includeViewParams)
+ {
+ return getActionURL(context, viewId);
+ }
+
+ /**
+ * Returns a URL, suitable for encoding and rendering, that (if activated)
+ * will retrieve the specified web application resource.
+ */
+ public abstract String getResourceURL(FacesContext context, String path);
+
+ /**
+ * Initialize the view for the request processing lifecycle.
+ * <P>
+ * This method must be called at the beginning of the Restore View Phase of the Request
+ * Processing Lifecycle. It is responsible for performing any per-request initialization
+ * necessary to the operation of the lifycecle.
+ * <P>
+ * The default implementation must perform the following actions. If
+ * ExternalContext.getRequestCharacterEncoding() returns null, call
+ * calculateCharacterEncoding(jakarta.faces.context.FacesContext) and pass the result,
+ * if non-null, into the ExternalContext.setRequestCharacterEncoding(java.lang.String) method.
+ * If ExternalContext.getRequestCharacterEncoding() returns non-null take no action.
+ *
+ * @since JSF 1.2
+ */
+ public void initView(FacesContext context) throws FacesException
+ {
+ String encoding = this.calculateCharacterEncoding(context);
+ if (encoding != null)
+ {
+ try
+ {
+ context.getExternalContext().setRequestCharacterEncoding(encoding);
+ }
+ catch (UnsupportedEncodingException uee)
+ {
+ throw new FacesException(uee);
+ }
+ }
+ }
+
+ /**
+ * Perform whatever actions are required to render the response view to the
+ * response object associated with the current FacesContext.
+ * <P>
+ * Otherwise, the default implementation must obtain a reference to the
+ * ViewDeclarationLanguage for the viewId of the argument viewToRender and call its
+ * ViewDeclarationLanguage.renderView(jakarta.faces.context.FacesContext, jakarta.faces.component.UIViewRoot)
+ * method, returning the result and not swallowing any exceptions thrown by that method.
+ */
+ public abstract void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException;
+
+ /**
+ * Perform whatever actions are required to restore the view associated with the
+ * specified FacesContext and viewId. It may delegate to the restoreView of the
+ * associated StateManager to do the actual work of restoring the view. If there
+ * is no available state for the specified viewId, return null.
+ * <P>
+ * Otherwise, the default implementation must obtain a reference to the
+ * ViewDeclarationLanguage for this viewId and call its
+ * ViewDeclarationLanguage.restoreView(jakarta.faces.context.FacesContext, java.lang.String)
+ * method, returning the result and not swallowing any exceptions thrown by that method.
+ */
+ public abstract UIViewRoot restoreView(FacesContext context, String viewId);
+
+ /**
+ * Take any appropriate action to either immediately write out the current state information
+ * (by calling StateManager.writeState(jakarta.faces.context.FacesContext, java.lang.Object),
+ * or noting where state information should later be written.
+ * <P>
+ * This method must do nothing if the current request is an Ajax request. When responding
+ * to Ajax requests, the state is obtained by calling StateManager.getViewState(jakarta.faces.context.FacesContext)
+ * and then written into the Ajax response during
+ * final encoding (UIViewRoot.encodeEnd(jakarta.faces.context.FacesContext).
+ */
+ public abstract void writeState(FacesContext context) throws IOException;
+
+ /**
+ * @since 2.2
+ * @param urlPattern
+ */
+ public void addProtectedView(String urlPattern)
+ {
+ }
+
+ /**
+ * @since 2.2
+ * @param urlPattern
+ */
+ public boolean removeProtectedView(String urlPattern)
+ {
+ return false;
+ }
+
+ /**
+ * @since 2.2
+ * @return
+ */
+ public Set<String> getProtectedViewsUnmodifiable()
+ {
+ Set<String> set = Collections.emptySet();
+ return Collections.unmodifiableSet(set);
+ }
+
+ /**
+ * Return a JSF URL that represents a websocket connection for the passed channel and channelToken
+ *
+ * @since 2.3
+ * @param context
+ * @param channelAndToken
+ * @return
+ */
+ public abstract String getWebsocketURL(FacesContext context, String channelAndToken);
+
+ /**
+ * @since 2.3
+ * @param facesContext
+ * @param path
+ * @param options
+ * @return
+ */
+ public Stream<java.lang.String> getViews(FacesContext facesContext, String path, ViewVisitOption... options)
+ {
+ return getViews(facesContext, path, Integer.MAX_VALUE, options);
+ }
+
+
+ /**
+ *
+ * @since 2.3
+ * @param facesContext
+ * @param path
+ * @param maxDepth
+ * @param options
+ * @return
+ */
+ public Stream<java.lang.String> getViews(FacesContext facesContext, String path,
+ int maxDepth, ViewVisitOption... options)
+ {
+ return Stream.empty();
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/ViewHandlerWrapper.java b/api/src/main/java/jakarta/faces/application/ViewHandlerWrapper.java
new file mode 100644
index 0000000..eea3d8f
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ViewHandlerWrapper.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.application;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import jakarta.faces.FacesException;
+import jakarta.faces.FacesWrapper;
+import jakarta.faces.component.UIViewRoot;
+import jakarta.faces.context.FacesContext;
+import jakarta.faces.view.ViewDeclarationLanguage;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/j2ee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public abstract class ViewHandlerWrapper extends ViewHandler
+ implements FacesWrapper<ViewHandler>
+{
+ private ViewHandler delegate;
+
+ @Deprecated
+ public ViewHandlerWrapper()
+ {
+ }
+
+ public ViewHandlerWrapper(ViewHandler delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public String calculateCharacterEncoding(FacesContext context)
+ {
+ return getWrapped().calculateCharacterEncoding(context);
+ }
+
+ @Override
+ public void initView(FacesContext context) throws FacesException
+ {
+ getWrapped().initView(context);
+ }
+
+ public ViewHandler getWrapped()
+ {
+ return delegate;
+ }
+
+ @Override
+ public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException
+ {
+ getWrapped().renderView(context, viewToRender);
+ }
+
+ @Override
+ public void writeState(FacesContext context) throws IOException
+ {
+ getWrapped().writeState(context);
+ }
+
+ @Override
+ public String calculateRenderKitId(FacesContext context)
+ {
+ return getWrapped().calculateRenderKitId(context);
+ }
+
+ @Override
+ public Locale calculateLocale(FacesContext context)
+ {
+ return getWrapped().calculateLocale(context);
+ }
+
+ @Override
+ public UIViewRoot restoreView(FacesContext context, String viewId)
+ {
+ return getWrapped().restoreView(context, viewId);
+ }
+
+ @Override
+ public String getResourceURL(FacesContext context, String path)
+ {
+ return getWrapped().getResourceURL(context, path);
+ }
+
+ @Override
+ public String getActionURL(FacesContext context, String viewId)
+ {
+ return getWrapped().getActionURL(context, viewId);
+ }
+
+ @Override
+ public UIViewRoot createView(FacesContext context, String viewId)
+ {
+ return getWrapped().createView(context, viewId);
+ }
+
+ @Override
+ public String deriveViewId(FacesContext context, String input)
+ {
+ return getWrapped().deriveViewId(context, input);
+ }
+
+ @Override
+ public String deriveLogicalViewId(FacesContext context, String rawViewId)
+ {
+ return getWrapped().deriveLogicalViewId(context, rawViewId);
+ }
+
+ @Override
+ public String getBookmarkableURL(FacesContext context, String viewId,
+ Map<String, List<String>> parameters, boolean includeViewParams)
+ {
+ return getWrapped().getBookmarkableURL(context, viewId, parameters, includeViewParams);
+ }
+
+ @Override
+ public String getRedirectURL(FacesContext context, String viewId,
+ Map<String, List<String>> parameters, boolean includeViewParams)
+ {
+ return getWrapped().getRedirectURL(context, viewId, parameters, includeViewParams);
+ }
+
+ @Override
+ public ViewDeclarationLanguage getViewDeclarationLanguage(
+ FacesContext context, String viewId)
+ {
+ return getWrapped().getViewDeclarationLanguage(context, viewId);
+ }
+
+ @Override
+ public Set<String> getProtectedViewsUnmodifiable()
+ {
+ return getWrapped().getProtectedViewsUnmodifiable();
+ }
+
+ @Override
+ public boolean removeProtectedView(String urlPattern)
+ {
+ return getWrapped().removeProtectedView(urlPattern);
+ }
+
+ @Override
+ public void addProtectedView(String urlPattern)
+ {
+ getWrapped().addProtectedView(urlPattern);
+ }
+
+ @Override
+ public String getWebsocketURL(FacesContext context, String channelAndToken)
+ {
+ return getWrapped().getWebsocketURL(context, channelAndToken);
+ }
+
+ @Override
+ public Stream<String> getViews(FacesContext facesContext, String path, int maxDepth, ViewVisitOption... options)
+ {
+ return getWrapped().getViews(facesContext, path, maxDepth, options);
+ }
+
+ @Override
+ public Stream<String> getViews(FacesContext facesContext, String path, ViewVisitOption... options)
+ {
+ return getWrapped().getViews(facesContext, path, options);
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/application/ViewResource.java b/api/src/main/java/jakarta/faces/application/ViewResource.java
new file mode 100644
index 0000000..936cf20
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ViewResource.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.net.URL;
+
+/**
+ *
+ * @since 2.2
+ */
+public abstract class ViewResource
+{
+ public ViewResource()
+ {
+ }
+
+ public abstract URL getURL();
+}
diff --git a/api/src/main/java/jakarta/faces/application/ViewVisitOption.java b/api/src/main/java/jakarta/faces/application/ViewVisitOption.java
new file mode 100644
index 0000000..a1fe74e
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/ViewVisitOption.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.application;
+
+/**
+ *
+ * @since 2.3
+ */
+public enum ViewVisitOption
+{
+ RETURN_AS_MINIMAL_IMPLICIT_OUTCOME
+}
diff --git a/api/src/main/java/jakarta/faces/application/_NavigationUtils.java b/api/src/main/java/jakarta/faces/application/_NavigationUtils.java
new file mode 100644
index 0000000..e87a8a0
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/application/_NavigationUtils.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.application;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import jakarta.faces.context.FacesContext;
+
+class _NavigationUtils
+{
+ /**
+ * Evaluate all EL expressions found as parameters and return a map that can be used for
+ * redirect or render bookmark links
+ *
+ * @param parameters parameter map retrieved from NavigationCase.getParameters()
+ * @return
+ */
+ public static Map<String, List<String> > getEvaluatedNavigationParameters(
+ FacesContext facesContext,
+ Map<String, List<String> > parameters)
+ {
+ Map<String,List<String>> evaluatedParameters = null;
+ if (parameters != null && parameters.size() > 0)
+ {
+ evaluatedParameters = new HashMap<String, List<String>>();
+ for (Map.Entry<String, List<String>> pair : parameters.entrySet())
+ {
+ boolean containsEL = false;
+ for (String value : pair.getValue())
+ {
+ if (_isExpression(value))
+ {
+ containsEL = true;
+ break;
+ }
+ }
+ if (containsEL)
+ {
+ evaluatedParameters.put(pair.getKey(),
+ _evaluateValueExpressions(facesContext, pair.getValue()));
+ }
+ else
+ {
+ evaluatedParameters.put(pair.getKey(), pair.getValue());
+ }
+ }
+ }
+ else
+ {
+ evaluatedParameters = parameters;
+ }
+ return evaluatedParameters;
+ }
+
+ /**
+ * Checks the Strings in the List for EL expressions and evaluates them.
+ * Note that the returned List will be a copy of the given List, because
+ * otherwise it will have unwanted side-effects.
+ * @param values
+ * @return
+ */
+ private static List<String> _evaluateValueExpressions(FacesContext context, List<String> values)
+ {
+ // note that we have to create a new List here, because if we
+ // change any value on the given List, it will be changed in the
+ // NavigationCase too and the EL expression won't be evaluated again
+ List<String> target = new ArrayList<String>(values.size());
+ for (String value : values)
+ {
+ if (_isExpression(value))
+ {
+ // evaluate the ValueExpression
+ value = context.getApplication().evaluateExpressionGet(context, value, String.class);
+ }
+ target.add(value);
+ }
+ return target;
+ }
+
+ private static boolean _isExpression(String text)
+ {
+ return text.indexOf("#{") != -1;
+ }
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/ApplicationScoped.java b/api/src/main/java/jakarta/faces/bean/ApplicationScoped.java
new file mode 100644
index 0000000..5b0db73
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/ApplicationScoped.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ *
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface ApplicationScoped
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/CustomScoped.java b/api/src/main/java/jakarta/faces/bean/CustomScoped.java
new file mode 100644
index 0000000..e9c2c5f
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/CustomScoped.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface CustomScoped
+{
+ public String value();
+}
diff --git a/api/src/main/java/jakarta/faces/bean/ManagedBean.java b/api/src/main/java/jakarta/faces/bean/ManagedBean.java
new file mode 100644
index 0000000..86683fc
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/ManagedBean.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface ManagedBean
+{
+ /**
+ * Taken to be the value of the eager attribute of the managed-bean.
+ */
+ public boolean eager() default false;
+
+ /**
+ * Taken to be the managed-bean-name. See class documentation for details.
+ */
+ public String name() default "";
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/ManagedProperty.java b/api/src/main/java/jakarta/faces/bean/ManagedProperty.java
new file mode 100644
index 0000000..a466188
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/ManagedProperty.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@Deprecated
+public @interface ManagedProperty
+{
+ /**
+ * Taken to be the managed-property-name.
+ */
+ public String name() default "";
+
+ /**
+ * Taken to be the value that is injected into the field.
+ */
+ public String value();
+}
diff --git a/api/src/main/java/jakarta/faces/bean/NoneScoped.java b/api/src/main/java/jakarta/faces/bean/NoneScoped.java
new file mode 100644
index 0000000..99e8b04
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/NoneScoped.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface NoneScoped
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/ReferencedBean.java b/api/src/main/java/jakarta/faces/bean/ReferencedBean.java
new file mode 100644
index 0000000..007f429
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/ReferencedBean.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.CLASS)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface ReferencedBean
+{
+ public String name() default "";
+}
diff --git a/api/src/main/java/jakarta/faces/bean/RequestScoped.java b/api/src/main/java/jakarta/faces/bean/RequestScoped.java
new file mode 100644
index 0000000..9a0d042
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/RequestScoped.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface RequestScoped
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/SessionScoped.java b/api/src/main/java/jakarta/faces/bean/SessionScoped.java
new file mode 100644
index 0000000..e18f448
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/SessionScoped.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated
+public @interface SessionScoped
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/ViewScoped.java b/api/src/main/java/jakarta/faces/bean/ViewScoped.java
new file mode 100644
index 0000000..4f36194
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/ViewScoped.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.0
+ */
+@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Deprecated // the spec says it's deprecated, but it IS actually still very useful!
+public @interface ViewScoped
+{
+
+}
diff --git a/api/src/main/java/jakarta/faces/bean/package-info.java b/api/src/main/java/jakarta/faces/bean/package-info.java
new file mode 100644
index 0000000..09509c2
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/bean/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+@Deprecated
+package jakarta.faces.bean;
\ No newline at end of file
diff --git a/api/src/main/java/jakarta/faces/component/ActionSource.java b/api/src/main/java/jakarta/faces/component/ActionSource.java
new file mode 100644
index 0000000..fa94c71
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/component/ActionSource.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.component;
+
+import jakarta.faces.el.MethodBinding;
+import jakarta.faces.event.ActionListener;
+
+/**
+ * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public interface ActionSource
+{
+ /**
+ * @deprecated Replaced by ActionSource2.getActionExpression
+ */
+ public MethodBinding getAction();
+
+ /**
+ * @deprecated Replaced by ActionSource2.setActionExpression
+ */
+ public void setAction(MethodBinding action);
+
+ /**
+ * @deprecated Replaced by getActionListeners
+ */
+ public MethodBinding getActionListener();
+
+ public void setActionListener(MethodBinding actionListener);
+
+ public boolean isImmediate();
+
+ public void setImmediate(boolean immediate);
+
+ public void addActionListener(ActionListener listener);
+
+ public ActionListener[] getActionListeners();
+
+ public void removeActionListener(ActionListener listener);
+}
diff --git a/api/src/main/java/jakarta/faces/component/ActionSource2.java b/api/src/main/java/jakarta/faces/component/ActionSource2.java
new file mode 100644
index 0000000..93933e1
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/component/ActionSource2.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.component;
+
+import javax.el.MethodExpression;
+
+/**
+ * See Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public interface ActionSource2 extends ActionSource
+{
+
+ public MethodExpression getActionExpression();
+
+ public void setActionExpression(MethodExpression action);
+}
diff --git a/api/src/main/java/jakarta/faces/component/ContextCallback.java b/api/src/main/java/jakarta/faces/component/ContextCallback.java
new file mode 100644
index 0000000..856cd6c
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/component/ContextCallback.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package jakarta.faces.component;
+
+import jakarta.faces.context.FacesContext;
+
+/**
+ * See Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
+ */
+public interface ContextCallback
+{
+
+ /**
+ *
+ * @param context <code>FacesContext</code> for the current request
+ * @param target <code>UIComponent</code> on which the <code>UIComponent.invokeOnComponent()</code> will be called
+ */
+ void invokeContextCallback(FacesContext context, UIComponent target);
+}
diff --git a/api/src/main/java/jakarta/faces/component/EditableValueHolder.java b/api/src/main/java/jakarta/faces/component/EditableValueHolder.java
new file mode 100644
index 0000000..e3802cb
--- /dev/null
+++ b/api/src/main/java/jakarta/faces/component/EditableValueHolder.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jakarta.faces.component;
+
+import jakarta.faces.el.MethodBinding;
+import jakarta.faces.event.ValueChangeListener;
+import jakarta.faces.validator.Validator;
+
+/**
+ * Defines the methods required for a component whose value can be modified by the user.
+ * <p>
+ * When a component implementing this interface is rendered, the value output is (in order):
+ * <ul>
+ * <li>The "submitted value" if non-null.
+ * <li>The component's "local value" if non-null.
+ * <li>The result of evaluating the value-binding expression with name "value" for this component.
+ * </ul>
+ * <p>
+ * Rendering the submitted value if non-null allows a component to redisplay a user-provided value when validation fails
+ * for the component. The submitted value is usually just the plain string extracted from the servlet request. During
+ * successful validation of the component, the submitted value is converted to an appropriate datatype, and stored as
+ * the component's "local value", and then the "submitted value" is immediately reset to null.
+ * <p>
+ * Rendering the "local value" if non-null allows a component to redisplay a page when validation fails for some other
+ * component; the model can't be updated unless <i>all</i> components have passed validation. This also allows
+ * components to work without a defined "value" value-binding expression. When all components validate, the update model
+ * phase runs; all components with "value" value-bindings store the "local value" into the specified property then reset
+ * their local value to null.
+ * <p>
+ * Rendering the value-binding expression named "value" allows components to display data from the user's model classes.
+ * This is the most common way a component's renderer obtains the value to display.
+ *
+ * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a> for
... 219291 lines suppressed ...