[
https://issues.apache.org/jira/browse/MYFACES-4428?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Thomas Andraschko resolved MYFACES-4428.
----------------------------------------
Resolution: Fixed
> Separate "begin tag" code from "end tag" code in HtmlTextRendererBase
> ---------------------------------------------------------------------
>
> Key: MYFACES-4428
> URL: https://issues.apache.org/jira/browse/MYFACES-4428
> Project: MyFaces Core
> Issue Type: Improvement
> Components: General
> Affects Versions: 2.3.9
> Reporter: Jonathan S. Fisher
> Priority: Major
> Fix For: 4.0.0-RC1, 2.3.10, 2.3-next-M7, 3.0.2
>
> Attachments: patch.diff
>
>
> We're trying to implement a few JSF components that extend from the generic
> JSF components/renderers. This particular component is extending
> javax.faces.component.html.HtmlInputText.
> On the renderer side, we're grabbing a handle to the default renderer of the
> component:
> {code:java}
> private static final String PARENT_FAMILY = "javax.faces.Input";
> private static final String PARENT_RENDERER = "javax.faces.Text";
> static final Renderer getWrappedRenderer(FacesContext context) {
> Renderer baseRenderer =
> context.getRenderKit().getRenderer(PARENT_FAMILY, PARENT_RENDERER);
> return baseRenderer;
> }{code}
> Then we're going to attempt to write out some new CSS classes for the
> component and leave the rest of everything alone:
> {code:java}
> @Override
> public void encodeBegin(FacesContext context, UIComponent component)
> throws IOException {
> Renderer baseRenderer = getWrappedRenderer(context);
> baseRenderer.encodeBegin(context, component);
> XXFaces.writeClasses(context, null, SF_FORM_CONTROL,
> BS_FORM_CONTROL);
> }
> @Override
> public void encodeEnd(FacesContext context, UIComponent component)
> throws IOException {
> Renderer baseRenderer = getWrappedRenderer(context);
> baseRenderer.encodeEnd(context, component);
> } {code}
>
>
> This unfortuantely presents a problem. HtmlTextRendererBase does not have an
> encodeBegin() method, instead it does all of the "Start tag" encoding in the
> encodeEnd() method. This makes it impossible to create custom components that
> wrap the functionality of the default render kit without extending myfaces
> renderers and breaks any chance cross-platform components.
> I propose adding this method to HtmlTextRendererBase:
> {code:java}
> @Override
> public void encodeBegin(FacesContext context, UIComponent component)
> throws IOException {
> if (component instanceof UIInput) {
> renderInputBegin(context, component);
> }
> } {code}
> and changing encodeEnd() to this following:
> {code:java}
> public void encodeEnd(FacesContext facesContext, UIComponent component)
> throws IOException
> {
>
> org.apache.myfaces.shared.renderkit.RendererUtils.checkParamValidity(facesContext,component,null);
>
> Map<String, List<ClientBehavior>> behaviors = null;
> if (component instanceof ClientBehaviorHolder)
> {
> behaviors = ((ClientBehaviorHolder)
> component).getClientBehaviors();
> if (!behaviors.isEmpty())
> {
>
> ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext,
> facesContext.getResponseWriter());
> }
> }
>
> if (component instanceof UIInput)
> {
> renderInputEnd(facesContext, component);
> }
> else if (component instanceof UIOutput)
> {
> renderOutput(facesContext, component);
> }
> else
> {
> throw new IllegalArgumentException("Unsupported component class "
> + component.getClass().getName());
> }
> } {code}
>
>
> This changes this section of encodeEnd()
>
> {code:java}
> if (component instanceof UIInput)
> {
> renderInput(facesContext, component);
> }{code}
>
>
> And removes the renderInput() method which just calls renderInputBegin()
> followed by renderInputEnd() anyway.
> I'm open to ideas an improvements. And one more note, open source work often
> goes unthanked, and I would like to express my gratitude for your work and
> passion on the MyFaces project at the ASF.
>
--
This message was sent by Atlassian Jira
(v8.20.1#820001)