All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ajax4jsf.framework.renderer.ChameleonRenderKitImpl Maven / Gradle / Ivy

Go to download

Ajax4jsf is an open source extension to the JavaServer Faces standard that adds AJAX capability to JSF applications without requiring the writing of any JavaScript.

The newest version!
/**
 * Licensed under the Common Development and Distribution License,
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.sun.com/cddl/
 *   
 * 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 org.ajax4jsf.framework.renderer;

import java.io.OutputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseStream;
import javax.faces.context.ResponseWriter;
import javax.faces.render.RenderKit;
import javax.faces.render.RenderKitFactory;
import javax.faces.render.Renderer;
import javax.faces.render.ResponseStateManager;

/**
 * Wrapper for default applikation render kit. Only can append any
 * custom renderers , all other methods delegate to default render kit.
 * 
 * @see javax.faces.render.RenderKit 
 * @author shura
 *
 */
public class ChameleonRenderKitImpl extends RenderKit implements ChameleonRenderKit {
    
    private RenderKit defaultRenderKit = null;
    public static final String RENDER_KIT_ID = "AJAX_HTML_BASIC";

    private Map renderers;


    //~ Constructors -------------------------------------------------------------------------------

    public ChameleonRenderKitImpl()
    {
        renderers = new HashMap();
    }

    //~ Methods ------------------------------------------------------------------------------------

    private String key(String componentFamily, String rendererType)
    {
        return componentFamily + "." + rendererType;
    }    
    /**
     * @param family
     * @param rendererType
     * @param renderer
     */
    public void addRenderer(String family, String rendererType,
            Renderer renderer) {
    	if (renderer instanceof ChameleonRenderer) {
			ChameleonRenderer chameleonRenderer = (ChameleonRenderer) renderer;
//			chameleonRenderer.setConfiguration(getConfiguration().getRendererConfiguration(family,rendererType));
			
		}
        renderers.put(key(family, rendererType), renderer);
    }
    /**
     * @param writer
     * @param contentTypeList
     * @param characterEncoding
     * @return
     */
    public ResponseWriter createResponseWriter(Writer writer,
            String contentTypeList, String characterEncoding) {
        return getDefaultRenderKit().createResponseWriter(writer, contentTypeList,
                characterEncoding);
    }
    /**
     * @param family
     * @param rendererType
     * @return
     */
    public Renderer getRenderer(String family, String rendererType) {
        Renderer renderer = (Renderer) renderers.get(key(family, rendererType));
        if (renderer != null) {
            return renderer;
        }
        return getDefaultRenderKit().getRenderer(family, rendererType);
    }
    /**
     * @return
     */
    public ResponseStateManager getResponseStateManager() {
        return getDefaultRenderKit().getResponseStateManager();
    }
    
    
    /* (non-Javadoc)
     * @see javax.faces.render.RenderKit#createResponseStream(java.io.OutputStream)
     */
    public ResponseStream createResponseStream(OutputStream out)
    {
        return getDefaultRenderKit().createResponseStream(out);
    }

    /**
     * TODO - create own implementation for @see javax.faces.component.UIViewRoot ,
     * and get default renderKitId as value, setted at creation time.
     * in this case, we can substitute concrete renderKit even if it pointed
     * as value for  tag on 1.2 specification.
     * @return Returns the defaultRenderer.
     */
    protected RenderKit getDefaultRenderKit() {
        if (defaultRenderKit == null)
        {
        	String defaultRenderkitId = null;
        	FacesContext context = null;
            RenderKitFactory rdf = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
            try {
				context = FacesContext.getCurrentInstance();
            	// IN JSF-RI verifications, context may be null !
            	if(null != context) {
				defaultRenderkitId = context.getApplication()
						.getDefaultRenderKitId();
            	} else {
                	ApplicationFactory appFactory =(ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
                	defaultRenderkitId = appFactory.getApplication().getDefaultRenderKitId();
				}
			} catch (Exception e) {
				// TODO: handle exception
			}
            if(defaultRenderkitId == null ){
                defaultRenderkitId = RenderKitFactory.HTML_BASIC_RENDER_KIT;
            }
            defaultRenderKit = rdf.getRenderKit(context, defaultRenderkitId);
            
        }

        return defaultRenderKit;
    }

	public void setDefaultRenderKit(RenderKit renderKit) {
		// TODO Auto-generated method stub
        this.defaultRenderKit = renderKit;
		
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy