Author: vbaranov
Date: 2008-04-10 08:04:30 -0400 (Thu, 10 Apr 2008)
New Revision: 7731
Modified:
trunk/ui/calendar/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
Log:
http://jira.jboss.com/jira/browse/RF-2969
Modified:
trunk/ui/calendar/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java
===================================================================
---
trunk/ui/calendar/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java 2008-04-10
10:16:43 UTC (rev 7730)
+++
trunk/ui/calendar/src/main/java/org/richfaces/renderkit/CalendarRendererBase.java 2008-04-10
12:04:30 UTC (rev 7731)
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.text.DateFormatSymbols;
import java.text.Format;
+import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@@ -34,10 +35,14 @@
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
+import java.util.logging.Level;
+import javax.el.ValueExpression;
+import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.DateTimeConverter;
import javax.faces.event.PhaseId;
@@ -108,26 +113,56 @@
}
}
- public Object getConvertedValue(FacesContext context,
- UIComponent component, Object submittedValue)
- throws ConverterException {
- if (submittedValue instanceof Date) {
- return (Date) submittedValue;
- }
- UICalendar calendar = (UICalendar) component;
- if (calendar.getConverter() != null) {
+ @Override
+ public Object getConvertedValue(FacesContext context, UIComponent component, Object
submittedValue)
+ throws ConverterException {
+ // skip conversion of already converted date
+ if (submittedValue instanceof Date) {
+ return (Date) submittedValue;
+ }
- return calendar.getConverter().getAsObject(context, component,
- (String) submittedValue);
-
- } else {
- DateTimeConverter converter = new DateTimeConverter();
- converter.setPattern(calendar.getDatePattern());
- converter.setLocale(calendar.getAsLocale(calendar.getLocale()));
- converter.setTimeZone(calendar.getTimeZone());
- return converter.getAsObject(context, component,
- (String) 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.
+ ValueExpression valueExpression = component.getValueExpression("value");
+ Converter converter = null;
+
+ UICalendar calendar = (UICalendar) component;
+ converter = calendar.getConverter();
+
+ if ((converter == null) && (valueExpression != null)) {
+ Class<?> converterType = valueExpression.getType(context.getELContext());
+ if((converterType != null) && (converterType != Object.class)) {
+ // if getType returns a type for which we support a default
+ // conversion, acquire an appropriate converter instance.
+ try {
+ Application application = context.getApplication();
+ converter = application.createConverter(converterType);
+ if (log.isInfoEnabled()) {
+ log.info(MessageFormat.format("Created converter ({0}) for type {1} for
component {2}.", new Object[] {
+ converter.getClass().getName(), converterType.getClass().getName(),
component.getId() }));
+ }
+ } catch (Exception e) {
+ if (log.isErrorEnabled()) {
+ log.error(MessageFormat.format("Could not instantiate converter for type {0}:
{1}", new Object[] {
+ converterType, e.toString() }));
+ }
+ return (null);
+ }
}
+ }
+
+ if (converter != null) {
+ // Use configured converter
+ return converter.getAsObject(context, component, newValue);
+ } else {
+ // in case the converter hasn't been set, try to use default DateTimeConverter
+ DateTimeConverter defaultConverter = new DateTimeConverter();
+ defaultConverter.setPattern(calendar.getDatePattern());
+ defaultConverter.setLocale(calendar.getAsLocale(calendar.getLocale()));
+ defaultConverter.setTimeZone(calendar.getTimeZone());
+ return defaultConverter.getAsObject(context, component, newValue);
+ }
}
protected void doDecode(FacesContext context, UIComponent component) {