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.myfaces.tobago.config.ThemeConfig;
021 import org.apache.commons.logging.Log;
022 import org.apache.commons.logging.LogFactory;
023
024 import javax.faces.render.Renderer;
025 import javax.faces.context.FacesContext;
026 import javax.faces.component.UIComponent;
027 import javax.faces.component.UIInput;
028 import javax.faces.component.ValueHolder;
029 import javax.faces.convert.Converter;
030 import javax.faces.convert.ConverterException;
031 import javax.faces.el.ValueBinding;
032 import javax.faces.FacesException;
033 import java.util.Locale;
034
035 /**
036 * Date: Apr 21, 2007
037 * Time: 8:04:25 PM
038 */
039 public class RendererBase extends Renderer {
040 protected static final Log LOG = LogFactory.getLog(LayoutableRendererBase.class);
041
042 public void decode(FacesContext facesContext, UIComponent component) {
043 // nothing to do
044
045 // FIXME later:
046 if (component instanceof UIInput) {
047 LOG.warn("decode() should be overwritten! Renderer: "
048 + this.getClass().getName());
049 }
050 }
051
052 public String getRendererName(String rendererType) {
053 String name;
054 if (LOG.isDebugEnabled()) {
055 LOG.debug("rendererType = '" + rendererType + "'");
056 }
057 /* if ("javax.faces.Text".equals(rendererType)) { // TODO: find a better way
058 name = RENDERER_TYPE_OUT;
059 } else {*/
060 name = rendererType;
061 /*}
062 if (name.startsWith("javax.faces.")) { // FIXME: this is a hotfix from jsf1.0beta to jsf1.0fr
063 LOG.warn("patching renderer from " + name);
064 name = name.substring("javax.faces.".length());
065 LOG.warn("patching renderer to " + name);
066 }*/
067 name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
068 return name;
069 }
070
071 public int getConfiguredValue(FacesContext facesContext,
072 UIComponent component, String key) {
073 try {
074 return ThemeConfig.getValue(facesContext, component, key);
075 } catch (Exception e) {
076 LOG.error("Can't take '" + key + "' for " + getClass().getName()
077 + " from config-file: " + e.getMessage(), e);
078 }
079 return 0;
080 }
081
082 protected String getCurrentValue(
083 FacesContext facesContext, UIComponent component) {
084
085 if (component instanceof UIInput) {
086 Object submittedValue = ((UIInput) component).getSubmittedValue();
087 if (submittedValue != null) {
088 return (String) submittedValue;
089 }
090 }
091 String currentValue = null;
092 Object currentObj = getValue(component);
093 if (currentObj != null) {
094 currentValue = RenderUtil.getFormattedValue(facesContext, component, currentObj);
095 }
096 return currentValue;
097 }
098
099 protected Object getValue(UIComponent component) {
100 if (component instanceof ValueHolder) {
101 Object value = ((ValueHolder) component).getValue();
102 if (LOG.isDebugEnabled()) {
103 LOG.debug("component.getValue() returned " + value);
104 }
105 return value;
106 } else {
107 return null;
108 }
109 }
110
111 public Converter getConverter(FacesContext context, UIComponent component) {
112 Converter converter = null;
113 if (component instanceof ValueHolder) {
114 converter = ((ValueHolder) component).getConverter();
115 }
116 if (converter == null) {
117 ValueBinding valueBinding = component.getValueBinding("value");
118 if (valueBinding != null) {
119 Class converterType = valueBinding.getType(context);
120 if (converterType == null || converterType == String.class
121 || converterType == Object.class) {
122 return null;
123 }
124 try {
125 converter = context.getApplication().createConverter(converterType);
126 } catch (FacesException e) {
127 LOG.error("No Converter found for type " + converterType);
128 }
129 }
130 }
131 return converter;
132 }
133
134 public Object getConvertedValue(FacesContext context,
135 UIComponent component, Object submittedValue)
136 throws ConverterException {
137 if (!(submittedValue instanceof String)) {
138 return submittedValue;
139 }
140 Converter converter = getConverter(context, component);
141 if (converter != null) {
142 return converter.getAsObject(context, component, (String) submittedValue);
143 } else {
144 return submittedValue;
145 }
146 }
147 }