You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Juan Fernandez Corugedo (Created) (JIRA)" <de...@myfaces.apache.org> on 2011/10/25 17:52:32 UTC

[jira] [Created] (MYFACES-3371) Add custom attributes with custom Renderer without extends Mysfaces Renderer

Add custom attributes with custom Renderer without extends Mysfaces Renderer
----------------------------------------------------------------------------

                 Key: MYFACES-3371
                 URL: https://issues.apache.org/jira/browse/MYFACES-3371
             Project: MyFaces Core
          Issue Type: Bug
          Components: General
    Affects Versions: 2.1.3
         Environment: Windows 7, Glassfish 3.1, Oracle JVM 1.6
            Reporter: Juan Fernandez Corugedo


I have created a custom render kit with some renderers. If the application request a renderer that is not registered in the render kit, it delegates the request to the HTML_BASIC renderkit:

public Renderer getRenderer(String family, String rendererType) {
		Renderer renderer = null;
		HashMap<String,Renderer> renderers = rendererFamilies.get(family);// In this Map I have put all the registered renderers
		
		if(renderers != null){
			renderer = renderers.get(rendererType);
		}
		
		if(renderer == null){
			//There are not any renderer defined for this Family and Rendertype, delegating the request to the HTML_BASIC renderkit
			FacesContext context = FacesContext.getCurrentInstance();
        	        RenderKit renderKit = getRenderKitFactory().getRenderKit(context, "HTML_BASIC");
    		        return renderKit.getRenderer(family, rendererType);
		}
        return ((renderers != null) ? renderers.get(rendererType) : null);
}


In the other hand, each Renderer performs some operations (add custom attributes, validations, etc...) and then delegate the process to the Renderer of the HTML_BASIC renderkit:

CustomInputTextRenderer extends Renderer{
...
        @Override
        public void encodeEnd(FacesContext context, UIComponent component) throws IOException {

                //DO SOME CUSTOM OPERATIONS LIKE ADD CUSTOM ATTRIBUTES
               
                // Then, call to the same method of the HTML_BASIC Renderer
		RenderKitFactory renderKitFactory = (RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
		RenderKit renderKit = renderKitFactory.getRenderKit(context, "HTML_BKS");
		renderKit.getRenderer(component.getFamily(), component.getRendererType()).encodeEnd(context, component);
	}

}


With this approach, there are not need of any class to extend any of the Myfaces renderer, so the application is decoupled from the JSF implementation.

This approach works good with Mojarra (2.1.0), because the Mojarra Renderers calls the ResponseWriter.startElement() in the Renderer.encodeBegin() and it calls the  ResponseWriter.endElement() in the Renderer.encodeEnd().

But with Myfaces (2.1.3) it does not work, because the Myfaces Renderers calls both ResponseWriter.startElement() and ResponseWriter.endElement() in the same method (Renderer.encodeEnd()), so there are not any way to insert code between these two calls without extends all the Myfaces Renderers.

This can be solved by changing all the Renderers (well, not all, the FormRenderer is ok, it calls the startElement in the encodeBegin and the endElement in the encodeEnd) moving the startElement call to the encodeBegin method.

Greetings.



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira