Author: nbelaevski
Date: 2011-02-08 10:12:45 -0500 (Tue, 08 Feb 2011)
New Revision: 21539
Modified:
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/SelectUtils.java
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/InputRendererBase.java
Log:
https://issues.jboss.org/browse/RF-10170
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java
===================================================================
---
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java 2011-02-08
15:06:32 UTC (rev 21538)
+++
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java 2011-02-08
15:12:45 UTC (rev 21539)
@@ -21,113 +21,164 @@
package org.richfaces.component.util;
-import java.io.Serializable;
-
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
+import javax.faces.component.UIInput;
import javax.faces.component.ValueHolder;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
-import org.ajax4jsf.Messages;
+import org.richfaces.renderkit.util.RendererUtils;
+import com.google.common.base.Strings;
+
/**
* @author Maksim Kaszynski
* @author Manfred Geiler
*/
public final class InputUtils {
- public static final String EMPTY_STRING = new String();
- public static final Object NOTHING = new Serializable() {
+
+ private static final ConverterLookupStrategy DEFAULT_CONVERTER_LOOKUP_STRATEGY = new
ConverterLookupStrategy() {
+
+ public Converter getConverterByValue(FacesContext context, UIComponent component,
Object value) {
+ Converter result = null;
+
+ if (component instanceof ValueHolder) {
+ result = ((ValueHolder) component).getConverter();
+ }
+
+ if (result == null && value != null) {
+ result = getConverterForType(context, value.getClass());
+ }
+
+ return result;
+ }
+
+ public Converter getConverterByProperty(FacesContext context, UIComponent
component) {
+ return findConverter(context, component, "value");
+ }
};
-
+
private InputUtils() {
}
- public static boolean isTrue(Object obj) {
- if (!(obj instanceof Boolean)) {
- return false;
- }
+ public static interface ConverterLookupStrategy {
- return ((Boolean) obj).booleanValue();
+ public Converter getConverterByProperty(FacesContext context, UIComponent
component);
+
+ public Converter getConverterByValue(FacesContext context, UIComponent component,
Object value);
}
public static boolean isDisabled(UIComponent component) {
- return isTrue(component.getAttributes().get("disabled"));
+ return RendererUtils.getInstance().isBooleanAttribute(component,
"disabled");
}
public static boolean isReadOnly(UIComponent component) {
- return isTrue(component.getAttributes().get("readonly"));
+ return RendererUtils.getInstance().isBooleanAttribute(component,
"readonly");
}
public static Converter getConverterForType(FacesContext context, Class<?>
type) {
- //see getConvertedValue
+ // see getConvertedValue
if (type == null || Object.class.equals(type)) {
return null;
}
-
+
return context.getApplication().createConverter(type);
}
+
+ public static String getConvertedStringValue(FacesContext context, UIComponent
component, Object value) throws ConverterException {
+ return getConvertedStringValue(context, component,
DEFAULT_CONVERTER_LOOKUP_STRATEGY, value);
+ }
- public static Object getConvertedValue(FacesContext context, UIComponent component,
Object submittedValue)
- throws ConverterException {
- String newValue = (String) submittedValue;
- ValueExpression valueExpression =
component.getValueExpression("value");
+ public static String getConvertedStringValue(FacesContext context, UIComponent
component,
+ ConverterLookupStrategy converterLookupStrategy, Object value) throws
ConverterException {
+
+ Converter converter = converterLookupStrategy.getConverterByValue(context,
component, value);
+ if (converter != null) {
+ return converter.getAsString(context, component, value);
+ }
+
+ if (value == null) {
+ return "";
+ }
+
+ if (value instanceof String) {
+ return (String) value;
+ }
+
+ return value.toString();
+ }
+
+ public static Converter findConverter(FacesContext facesContext, UIComponent
component, String property) {
Converter converter = null;
-
+
if (component instanceof ValueHolder) {
converter = ((ValueHolder) component).getConverter();
}
- if ((converter == null) && (valueExpression != null)) {
- Class converterType = valueExpression.getType(context.getELContext());
+ if (converter == null) {
- //see getConverterForType
- if ((converterType == null) || (converterType == Object.class)) {
- return newValue;
- } else {
- converter = context.getApplication().createConverter(converterType);
+ ValueExpression ve = component.getValueExpression(property);
- if (converter == null) {
- if (String.class.equals(converterType)) {
- return newValue;
- }
- throw new
ConverterException(Messages.getMessage(Messages.NO_CONVERTER_FOUND_ERROR,
- converterType.getName()));
+ if (ve != null) {
+
+ Class<?> valueType = ve.getType(facesContext.getELContext());
+ if (valueType == null || Object.class.equals(valueType)) {
+ // No converter needed
+ } else {
+ converter =
facesContext.getApplication().createConverter(valueType);
}
+
}
- } else if (converter == null) {
- return newValue;
}
- return converter.getAsObject(context, component, newValue);
+ return converter;
}
- public static String getConvertedStringValue(FacesContext context, UIComponent
component, Object value) {
- Converter converter = null;
+ public static Object getConvertedValue(FacesContext context, UIComponent component,
Object val)
+ throws ConverterException {
+
+ return getConvertedValue(context, component, DEFAULT_CONVERTER_LOOKUP_STRATEGY,
val);
+ }
- if (component instanceof ValueHolder) {
- converter = ((ValueHolder) component).getConverter();
+ public static Object getConvertedValue(FacesContext context, UIComponent component,
+ ConverterLookupStrategy converterLookupStrategy, Object val) throws
ConverterException {
+
+ String submittedString = (String) val;
+ if (Strings.isNullOrEmpty(submittedString)) {
+ return null;
}
- if (converter == null) {
- if (value == null) {
- return "";
- } else if (value instanceof String) {
- return (String) value;
- }
+ Converter converter = converterLookupStrategy.getConverterByProperty(context,
(UIInput) component);
+ if (converter != null) {
+ return converter.getAsObject(context, component, submittedString);
+ }
- Class converterType = value.getClass();
+ return submittedString;
+ }
- if (converterType != null) {
- converter = context.getApplication().createConverter(converterType);
- }
+ public static String getInputValue(FacesContext context, UIComponent component)
throws ConverterException {
+ return getInputValue(context, component, DEFAULT_CONVERTER_LOOKUP_STRATEGY);
+ }
- if (converter == null) {
- return value.toString();
- }
+ public static String getInputValue(FacesContext context, UIComponent component,
+ ConverterLookupStrategy converterLookupStrategy) throws ConverterException {
+
+ UIInput input = (UIInput) component;
+ String submittedValue = (String) input.getSubmittedValue();
+
+ if (submittedValue != null) {
+ return submittedValue;
}
- return converter.getAsString(context, component, value);
+ Object value = input.getValue();
+ Converter converter = converterLookupStrategy.getConverterByValue(context, input,
value);
+
+ if (converter != null) {
+ return converter.getAsString(context, input, value);
+ } else {
+ return value != null ? value.toString() : "";
+ }
}
}
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/component/util/SelectUtils.java
===================================================================
---
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/SelectUtils.java 2011-02-08
15:06:32 UTC (rev 21538)
+++
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/SelectUtils.java 2011-02-08
15:12:45 UTC (rev 21539)
@@ -21,10 +21,6 @@
package org.richfaces.component.util;
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
@@ -32,13 +28,9 @@
import javax.el.ValueExpression;
import javax.faces.application.ProjectStage;
import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
-import javax.faces.component.UIOutput;
import javax.faces.component.UISelectItem;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
-import javax.faces.convert.Converter;
-import javax.faces.convert.ConverterException;
import javax.faces.model.SelectItem;
import org.richfaces.log.Logger;
@@ -57,6 +49,8 @@
private static final class GenericObjectSelectItem extends SelectItem {
+ private static final long serialVersionUID = -714217221281952395L;
+
private static final RendererUtils UTILS = RendererUtils.getInstance();
private static final String VAR = "var";
@@ -102,14 +96,6 @@
}
- private void writeObject(ObjectOutputStream out) throws IOException {
- throw new NotSerializableException();
- }
-
- private void readObject(ObjectInputStream in) throws IOException {
- throw new NotSerializableException();
- }
-
}
private static final class MapItemsIterator extends
AbstractIterator<SelectItem> {
@@ -284,39 +270,4 @@
return new SelectItemsIterator(context, component.getChildren().iterator());
}
- public static Object getConvertedUIInputValue(FacesContext facesContext, UIInput
component, String submittedValue) throws ConverterException {
- if (InputUtils.EMPTY_STRING.equals(submittedValue)) {
- return null;
- }
-
- Converter converter = SelectUtils.findConverter(facesContext, component,
"value");
- if (converter != null) {
- return converter.getAsObject(facesContext, component, submittedValue);
- }
-
- return submittedValue;
- }
-
- public static Converter findConverter(FacesContext facesContext, UIOutput component,
String property) {
- Converter converter = component.getConverter();
-
- if (converter == null) {
-
- ValueExpression ve = component.getValueExpression(property);
-
- if (ve != null) {
-
- Class<?> valueType = ve.getType(facesContext.getELContext());
- if ((valueType == null) || Object.class.equals(valueType)) {
- // No converter needed
- } else {
- converter =
facesContext.getApplication().createConverter(valueType);
- }
-
- }
- }
-
- return converter;
- }
-
}
Modified:
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java
===================================================================
---
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java 2011-02-08
15:06:32 UTC (rev 21538)
+++
trunk/ui/common/ui/src/main/java/org/richfaces/renderkit/util/RendererUtils.java 2011-02-08
15:12:45 UTC (rev 21539)
@@ -32,20 +32,16 @@
import java.util.LinkedHashMap;
import java.util.Map;
-import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
-import javax.faces.component.EditableValueHolder;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.component.UIParameter;
import javax.faces.component.UIViewRoot;
-import javax.faces.component.ValueHolder;
import javax.faces.component.behavior.ClientBehaviorContext.Parameter;
import javax.faces.component.behavior.ClientBehaviorHolder;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
-import javax.faces.convert.Converter;
import org.ajax4jsf.Messages;
import org.ajax4jsf.component.JavaScriptParameter;
@@ -489,77 +485,6 @@
return result;
}
- /**
- * Return converted value for {@link javax.faces.component.ValueHolder} as
- * String, perform nessesary convertions.
- *
- * @param context
- * @param component
- * @return
- */
- public String getValueAsString(FacesContext context, UIComponent component) {
-
- // First - get submitted value for input components
- if (component instanceof EditableValueHolder) {
- EditableValueHolder input = (EditableValueHolder) component;
- String submittedValue = (String) input.getSubmittedValue();
-
- if (null != submittedValue) {
- return submittedValue;
- }
- }
-
- // If no submitted value presented - convert same for UIInput/UIOutput
- if (component instanceof ValueHolder) {
- return formatValue(context, component, ((ValueHolder)
component).getValue());
- } else {
- throw new IllegalArgumentException(
- Messages.getMessage(Messages.CONVERTING_NON_VALUE_HOLDER_COMPONENT_ERROR,
component.getId()));
- }
- }
-
- /**
- * Convert any object value to string. If component instance of
- * {@link ValueHolder } got {@link Converter} for formatting. If not,
- * attempt to use converter based on value type.
- *
- * @param context
- * @param component
- * @return
- */
- public String formatValue(FacesContext context, UIComponent component, Object value)
{
- if (value instanceof String) {
- return (String) value;
- }
-
- Converter converter = null;
-
- if (component instanceof ValueHolder) {
- ValueHolder holder = (ValueHolder) component;
-
- converter = holder.getConverter();
- }
-
- if ((null == converter) && (null != value)) {
- try {
- converter = context.getApplication().createConverter(value.getClass());
- } catch (FacesException e) {
-
- // TODO - log converter exception.
- }
- }
-
- if (null == converter) {
- if (null != value) {
- return value.toString();
- }
- } else {
- return converter.getAsString(context, component, value);
- }
-
- return "";
- }
-
public String encodePx(String value) {
return HtmlDimensions.formatPx(HtmlDimensions.decode(value));
}
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java 2011-02-08
15:06:32 UTC (rev 21538)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java 2011-02-08
15:12:45 UTC (rev 21539)
@@ -22,32 +22,42 @@
package org.richfaces.renderkit;
+import java.io.IOException;
+import java.text.DateFormatSymbols;
+import java.text.Format;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.TimeZone;
+
+import javax.faces.application.ResourceDependencies;
+import javax.faces.application.ResourceDependency;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.PartialViewContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
+import javax.faces.convert.DateTimeConverter;
+
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.JSReference;
import org.richfaces.component.AbstractCalendar;
import org.richfaces.component.MetaComponentResolver;
import org.richfaces.component.Positioning;
import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.component.util.InputUtils;
+import org.richfaces.component.util.InputUtils.ConverterLookupStrategy;
import org.richfaces.component.util.MessageUtil;
-import org.richfaces.component.util.SelectUtils;
import org.richfaces.context.ExtendedPartialViewContext;
import org.richfaces.event.CurrentDateChangeEvent;
import org.richfaces.utils.CalendarHelper;
-import javax.faces.application.ResourceDependencies;
-import javax.faces.application.ResourceDependency;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.context.PartialViewContext;
-import javax.faces.convert.Converter;
-import javax.faces.convert.ConverterException;
-import javax.faces.convert.DateTimeConverter;
-import java.io.IOException;
-import java.text.DateFormatSymbols;
-import java.text.Format;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
/**
* @author amarkhel
*
@@ -142,6 +152,41 @@
private static final String SECONDS_VALUE = "seconds";
+ protected final ConverterLookupStrategy calendarConverterLookupStrategy = new
ConverterLookupStrategy() {
+
+ public Converter getConverterByValue(FacesContext context, UIComponent component,
Object value) throws ConverterException {
+ AbstractCalendar calendar = (AbstractCalendar) component;
+ Converter converter = calendar.getConverter();
+
+ if (converter == null && value != null) {
+ converter = InputUtils.getConverterForType(context, value.getClass());
+ }
+
+ // in case the converter hasn't been set, try to use default
+ // DateTimeConverter
+ if (converter == null) {
+ converter = createDefaultConverter(context);
+ }
+
+ setupConverter(context, converter, (AbstractCalendar) component);
+ return converter;
+ }
+
+ public Converter getConverterByProperty(FacesContext context, UIComponent
component) throws ConverterException {
+ AbstractCalendar calendar = (AbstractCalendar) component;
+ Converter converter = InputUtils.findConverter(context, calendar,
"value");
+
+ // in case the converter hasn't been set, try to use default
+ // DateTimeConverter
+ if (converter == null) {
+ converter = createDefaultConverter(context);
+ }
+
+ setupConverter(context, converter, calendar);
+ return converter;
+ }
+ };
+
protected void doDecode(FacesContext context, UIComponent component) {
if (!(component instanceof AbstractCalendar)) {
return;
@@ -190,53 +235,16 @@
return submittedValue;
}
- // Store submitted value in the local variable as a string
- String newValue = (String) submittedValue;
- // if we have no local value, try to get the valueExpression.
- AbstractCalendar calendar = (AbstractCalendar) component;
- Converter converter = SelectUtils.findConverter(facesContext, calendar,
"value");
+ return InputUtils.getConvertedValue(facesContext, component,
calendarConverterLookupStrategy, submittedValue);
+ }
- // in case the converter hasn't been set, try to use default
- // DateTimeConverter
- if (converter == null) {
- converter = createDefaultConverter(facesContext);
- }
-
- setupConverter(facesContext, converter, calendar);
- return converter.getAsObject(facesContext, component, newValue);
- }
-
@Override
public String getInputValue(FacesContext facesContext, UIComponent component) {
if (!(component instanceof AbstractCalendar)) {
return null;
}
- AbstractCalendar calendar = (AbstractCalendar) component;
- String value = (String) calendar.getSubmittedValue();
- if (value == null) {
- Object curVal = calendar.getValue();
- Converter converter = SelectUtils.findConverter(facesContext, calendar,
"value");
-
- if (converter == null) {
- converter = createDefaultConverter(facesContext);
- }
-
- setupConverter(facesContext, converter, calendar);
-
- if (converter != null) {
- value = converter.getAsString(facesContext, calendar, curVal);
- } else {
- value = curVal != null ? curVal.toString() : "";
- }
- }
-
- if (value == null) {
- value = "";
- }
-
- return value;
-
+ return InputUtils.getInputValue(facesContext, component,
calendarConverterLookupStrategy);
}
public String getButtonIcon(FacesContext facesContext, UIComponent component) {
Modified: trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/InputRendererBase.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/InputRendererBase.java 2011-02-08
15:06:32 UTC (rev 21538)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/InputRendererBase.java 2011-02-08
15:12:45 UTC (rev 21539)
@@ -22,15 +22,15 @@
package org.richfaces.renderkit;
-import org.richfaces.component.util.SelectUtils;
+import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
-import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
-import java.util.Map;
+import org.richfaces.component.util.InputUtils;
+
/**
* @author Nick Belaevski - nbelaevski(a)exadel.com
* created 23.01.2007
@@ -50,32 +50,10 @@
}
public Object getConvertedValue(FacesContext context, UIComponent component, Object
val) throws ConverterException {
- return SelectUtils.getConvertedUIInputValue(context, (UIInput) component,
(String) val);
+ return InputUtils.getConvertedValue(context, component, val);
}
- public String getInputValue(FacesContext context, UIComponent component) {
- UIInput input = (UIInput) component;
- String value = (String) input.getSubmittedValue();
-
- if (value == null) {
- Object curVal = input.getValue();
- Converter converter = SelectUtils.findConverter(context, input,
"value");
-
- if (converter != null) {
- value = converter.getAsString(context, input, curVal);
- } else {
- if (curVal == null) {
- value = "";
- } else {
- value = curVal.toString();
- }
- }
- }
-
- if (value == null) {
- value = "";
- }
-
- return value;
+ public String getInputValue(FacesContext context, UIComponent component) throws
ConverterException {
+ return InputUtils.getInputValue(context, component);
}
}