/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.jsf.html; import java.io.*; import java.util.*; import javax.faces.context.*; import javax.faces.render.*; import com.caucho.util.*; import com.caucho.vfs.*; public class HtmlBasicRenderKit extends RenderKit { private static final L10N L = new L10N(HtmlBasicRenderKit.class); private ResponseStateManager _responseStateManager = new ResponseStateManagerImpl(); private HashMap<Key,Renderer> _rendererMap = new HashMap<Key,Renderer>(); private Key _key = new Key(); public HtmlBasicRenderKit() { addRenderer("javax.faces.Command", "javax.faces.Button", HtmlCommandButtonRenderer.RENDERER); addRenderer("javax.faces.Command", "javax.faces.Link", HtmlCommandLinkRenderer.RENDERER); addRenderer("javax.faces.Data", "javax.faces.Table", HtmlDataTableRenderer.RENDERER); addRenderer("javax.faces.Form", "javax.faces.Form", HtmlFormRenderer.RENDERER); addRenderer("javax.faces.Graphic", "javax.faces.Image", HtmlGraphicImageRenderer.RENDERER); addRenderer("javax.faces.Input", "javax.faces.Secret", HtmlInputSecretRenderer.RENDERER); addRenderer("javax.faces.Input", "javax.faces.Hidden", HtmlInputHiddenRenderer.RENDERER); addRenderer("javax.faces.Input", "javax.faces.Text", HtmlInputTextRenderer.RENDERER); addRenderer("javax.faces.Input", "javax.faces.Textarea", HtmlInputTextareaRenderer.RENDERER); addRenderer("javax.faces.Message", "javax.faces.Message", HtmlMessageRenderer.RENDERER); addRenderer("javax.faces.Messages", "javax.faces.Messages", HtmlMessagesRenderer.RENDERER); addRenderer("javax.faces.Output", "javax.faces.Format", HtmlOutputFormatRenderer.RENDERER); addRenderer("javax.faces.Output", "javax.faces.Label", HtmlOutputLabelRenderer.RENDERER); addRenderer("javax.faces.Output", "javax.faces.Link", HtmlOutputLinkRenderer.RENDERER); addRenderer("javax.faces.Output", "javax.faces.Text", HtmlOutputTextRenderer.RENDERER); addRenderer("javax.faces.Output", "javax.faces.Format", HtmlOutputFormatRenderer.RENDERER); addRenderer("javax.faces.Panel", "javax.faces.Grid", HtmlPanelGridRenderer.RENDERER); addRenderer("javax.faces.Panel", "javax.faces.Group", HtmlPanelGroupRenderer.RENDERER); addRenderer("javax.faces.SelectBoolean", "javax.faces.Checkbox", HtmlBooleanCheckboxRenderer.RENDERER); addRenderer("javax.faces.SelectMany", "javax.faces.Checkbox", HtmlSelectManyCheckboxRenderer.RENDERER); addRenderer("javax.faces.SelectMany", "javax.faces.Listbox", HtmlSelectManyListboxRenderer.RENDERER); addRenderer("javax.faces.SelectMany", "javax.faces.Menu", HtmlSelectManyMenuRenderer.RENDERER); addRenderer("javax.faces.SelectOne", "javax.faces.Listbox", HtmlSelectOneListboxRenderer.RENDERER); addRenderer("javax.faces.SelectOne", "javax.faces.Menu", HtmlSelectOneMenuRenderer.RENDERER); addRenderer("javax.faces.SelectOne", "javax.faces.Radio", HtmlSelectOneRadioRenderer.RENDERER); } public void addRenderer(String family, String rendererType, Renderer renderer) { if (family == null) throw new NullPointerException("family argument is null"); if (rendererType == null) throw new NullPointerException("rendererType argument is null"); if (renderer == null) throw new NullPointerException("renderer argument is null"); _rendererMap.put(new Key(family, rendererType), renderer); } public Renderer getRenderer(String family, String rendererType) { if (family == null) throw new NullPointerException("family argument is null"); if (rendererType == null) throw new NullPointerException("rendererType argument is null"); _key.init(family, rendererType); Renderer renderer = _rendererMap.get(_key); return renderer; } public ResponseStateManager getResponseStateManager() { return _responseStateManager; } public ResponseWriter createResponseWriter(Writer writer, String contentTypeList, String characterEncoding) { String contentType = null; if (contentTypeList != null) { if (contentTypeList.indexOf("text/html") > -1) { contentType = "text/html"; } else if (contentTypeList.indexOf("application/xhtml+xml") > -1 || contentTypeList.indexOf("application/xml") > -1 || contentTypeList.indexOf("text/xml") > -1) { contentType = "application/xhtml+xml"; } else if (contentTypeList.indexOf("*/*") > -1) { contentType = "text/html"; } else { throw new IllegalArgumentException(L.l( "'{0}' does not have a matching ResponseWriter.", contentTypeList)); } } if (characterEncoding != null) { if (Encoding.getWriteEncoding(characterEncoding) == null) throw new IllegalArgumentException(L.l("'{0}' is an unknown character encoding for ResponseWriter.", characterEncoding)); } return new HtmlResponseWriter(writer, contentType, characterEncoding); } public ResponseStream createResponseStream(OutputStream out) { return new HtmlResponseStream(out); } public String toString() { return "HtmlBasicRenderKit[]"; } static final class Key { private String _family; private String _type; Key() { } Key(String family, String type) { _family = family; _type = type; } public void init(String family, String type) { _family = family; _type = type; } @Override public int hashCode() { if (_type != null) return _family.hashCode() * 65521 + _type.hashCode(); else return _family.hashCode(); } public boolean equals(Object o) { Key key = (Key) o; if (_type != null) return _family.equals(key._family) && _type.equals(key._type); else return _family.equals(key._family) && key._type != null; } public String toString() { return "Key[" + _family + ", " + _type + "]"; } } }