001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 package org.apache.myfaces.tobago.renderkit; 021 022 import org.apache.myfaces.tobago.config.ThemeConfig; 023 import org.apache.commons.logging.Log; 024 import org.apache.commons.logging.LogFactory; 025 026 import javax.faces.render.Renderer; 027 import javax.faces.context.FacesContext; 028 import javax.faces.component.UIComponent; 029 import javax.faces.component.UIInput; 030 import javax.faces.component.ValueHolder; 031 import javax.faces.convert.Converter; 032 import javax.faces.convert.ConverterException; 033 import javax.faces.el.ValueBinding; 034 import javax.faces.FacesException; 035 import java.util.Locale; 036 037 /** 038 * Date: Apr 21, 2007 039 * Time: 8:04:25 PM 040 */ 041 public class RendererBase extends Renderer { 042 protected static final Log LOG = LogFactory.getLog(LayoutableRendererBase.class); 043 044 public void decode(FacesContext facesContext, UIComponent component) { 045 // nothing to do 046 047 // FIXME later: 048 if (component instanceof UIInput) { 049 LOG.warn("decode() should be overwritten! Renderer: " 050 + this.getClass().getName()); 051 } 052 } 053 054 public String getRendererName(String rendererType) { 055 String name; 056 if (LOG.isDebugEnabled()) { 057 LOG.debug("rendererType = '" + rendererType + "'"); 058 } 059 /* if ("javax.faces.Text".equals(rendererType)) { // TODO: find a better way 060 name = RENDERER_TYPE_OUT; 061 } else {*/ 062 name = rendererType; 063 /*} 064 if (name.startsWith("javax.faces.")) { // FIXME: this is a hotfix from jsf1.0beta to jsf1.0fr 065 LOG.warn("patching renderer from " + name); 066 name = name.substring("javax.faces.".length()); 067 LOG.warn("patching renderer to " + name); 068 }*/ 069 name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1); 070 return name; 071 } 072 073 public int getConfiguredValue(FacesContext facesContext, 074 UIComponent component, String key) { 075 try { 076 return ThemeConfig.getValue(facesContext, component, key); 077 } catch (Exception e) { 078 LOG.error("Can't take '" + key + "' for " + getClass().getName() 079 + " from config-file: " + e.getMessage(), e); 080 } 081 return 0; 082 } 083 084 protected String getCurrentValue( 085 FacesContext facesContext, UIComponent component) { 086 087 if (component instanceof UIInput) { 088 Object submittedValue = ((UIInput) component).getSubmittedValue(); 089 if (submittedValue != null) { 090 return (String) submittedValue; 091 } 092 } 093 String currentValue = null; 094 Object currentObj = getValue(component); 095 if (currentObj != null) { 096 currentValue = RenderUtil.getFormattedValue(facesContext, component, currentObj); 097 } 098 return currentValue; 099 } 100 101 protected Object getValue(UIComponent component) { 102 if (component instanceof ValueHolder) { 103 return ((ValueHolder) component).getValue(); 104 } else { 105 return null; 106 } 107 } 108 109 public Converter getConverter(FacesContext context, UIComponent component) { 110 Converter converter = null; 111 if (component instanceof ValueHolder) { 112 converter = ((ValueHolder) component).getConverter(); 113 } 114 if (converter == null) { 115 ValueBinding valueBinding = component.getValueBinding("value"); 116 if (valueBinding != null) { 117 Class converterType = valueBinding.getType(context); 118 if (converterType == null || converterType == String.class 119 || converterType == Object.class) { 120 return null; 121 } 122 try { 123 converter = context.getApplication().createConverter(converterType); 124 } catch (FacesException e) { 125 LOG.error("No Converter found for type " + converterType); 126 } 127 } 128 } 129 return converter; 130 } 131 132 public Object getConvertedValue(FacesContext context, 133 UIComponent component, Object submittedValue) 134 throws ConverterException { 135 if (!(submittedValue instanceof String)) { 136 return submittedValue; 137 } 138 Converter converter = getConverter(context, component); 139 if (converter != null) { 140 return converter.getAsObject(context, component, (String) submittedValue); 141 } else { 142 return submittedValue; 143 } 144 } 145 }