001 package org.apache.myfaces.tobago.renderkit; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one or more 005 * contributor license agreements. See the NOTICE file distributed with 006 * this work for additional information regarding copyright ownership. 007 * The ASF licenses this file to You under the Apache License, Version 2.0 008 * (the "License"); you may not use this file except in compliance with 009 * the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 */ 019 020 import org.apache.commons.logging.Log; 021 import org.apache.commons.logging.LogFactory; 022 import org.apache.myfaces.tobago.context.ResourceManager; 023 import org.apache.myfaces.tobago.context.ResourceManagerFactory; 024 import org.apache.myfaces.tobago.webapp.TobagoResponseWriterImpl; 025 026 import javax.faces.FactoryFinder; 027 import javax.faces.context.FacesContext; 028 import javax.faces.context.ResponseStream; 029 import javax.faces.context.ResponseWriter; 030 import javax.faces.render.RenderKit; 031 import javax.faces.render.RenderKitFactory; 032 import javax.faces.render.Renderer; 033 import javax.faces.render.ResponseStateManager; 034 import java.io.OutputStream; 035 import java.io.Writer; 036 037 public class TobagoRenderKit extends RenderKit { 038 039 private static final Log LOG = LogFactory.getLog(TobagoRenderKit.class); 040 041 public static final String RENDER_KIT_ID = "tobago"; 042 043 private ResourceManager resources; 044 045 private ResponseStateManager responseStateManager; 046 047 public TobagoRenderKit() { 048 responseStateManager = new TobagoResponseStateManager(); 049 } 050 051 // FIXME: use family 052 @Override 053 public Renderer getRenderer(String family, String rendererType) { 054 if (LOG.isDebugEnabled()) { 055 LOG.debug("family = '" + family + "'"); 056 } 057 Renderer renderer = null; 058 FacesContext facesContext = FacesContext.getCurrentInstance(); 059 if (!"facelets".equals(family)) { 060 if (rendererType != null) { 061 if (resources == null) { 062 resources = ResourceManagerFactory.getResourceManager(facesContext); 063 } 064 renderer = resources.getRenderer(facesContext.getViewRoot(), rendererType); 065 } 066 } 067 068 if (renderer == null) { 069 RenderKitFactory rkFactory = (RenderKitFactory) 070 FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); 071 RenderKit renderKit = rkFactory.getRenderKit(facesContext, RenderKitFactory.HTML_BASIC_RENDER_KIT); 072 renderer = renderKit.getRenderer(family, rendererType); 073 if (renderer != null) { 074 renderer = new RendererBaseWrapper(renderer); 075 } 076 } 077 078 if (renderer == null) { 079 LOG.error("The class which was found by the ResourceManager cannot be " 080 + "found or instantiated: classname='" + rendererType + "'"); 081 } 082 083 return renderer; 084 } 085 086 @Override 087 public ResponseWriter createResponseWriter( 088 Writer writer, String contentTypeList, String characterEncoding) { 089 String contentType; 090 if (contentTypeList == null) { 091 contentType = "text/html"; 092 } else if (contentTypeList.indexOf("text/html") > -1) { 093 contentType = "text/html"; 094 LOG.warn("patching content type from " + contentTypeList + " to " + contentType + "'"); 095 } else if (contentTypeList.indexOf("text/fo") > -1) { 096 contentType = "text/fo"; 097 LOG.warn("patching content type from " + contentTypeList + " to " + contentType + "'"); 098 } else { 099 contentType = "text/html"; 100 LOG.warn("Content-Type '" + contentTypeList + "' not supported!" 101 + " Using text/html", new Exception()); 102 } 103 104 return new TobagoResponseWriterImpl(writer, contentType, characterEncoding); 105 } 106 107 108 // ///////////////////////////////////////////// TODO 109 110 @Override 111 public void addRenderer(String family, String rendererType, Renderer renderer) { 112 // synchronized(renderers) { 113 // renderers.put(family + SEP + rendererType, renderer); 114 // } 115 if (LOG.isDebugEnabled()) { 116 LOG.debug("addRenderer family='" + family 117 + "' rendererType='" + rendererType + "'"); 118 } 119 LOG.error( 120 "This method isn't implemented yet, and should not be called: " 121 + new Exception().getStackTrace()[0].getMethodName()); //FIXME jsf1.0 122 } 123 124 @Override 125 public ResponseStateManager getResponseStateManager() { 126 return responseStateManager; 127 } 128 129 @Override 130 public ResponseStream createResponseStream(OutputStream outputstream) { 131 LOG.error( 132 "This method isn't implemented yet, and should not be called: " 133 + new Exception().getStackTrace()[0].getMethodName()); //FIXME jsfbeta 134 return null; 135 } 136 }