You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/04/02 00:26:58 UTC
svn commit: r930115 - in
/myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date:
./ HtmlDateRenderer.java
Author: lu4242
Date: Thu Apr 1 22:26:58 2010
New Revision: 930115
URL: http://svn.apache.org/viewvc?rev=930115&view=rev
Log:
TOMAHAWK-1472 Add Support for new Resource API in tomahawk 2.0 module
Added:
myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date/
myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date/HtmlDateRenderer.java
Added: myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date/HtmlDateRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date/HtmlDateRenderer.java?rev=930115&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date/HtmlDateRenderer.java (added)
+++ myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/date/HtmlDateRenderer.java Thu Apr 1 22:26:58 2010
@@ -0,0 +1,532 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.custom.date;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.DateFormatSymbols;
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.convert.ConverterException;
+import javax.faces.event.ComponentSystemEvent;
+import javax.faces.event.ComponentSystemEventListener;
+import javax.faces.event.ListenerFor;
+
+import org.apache.myfaces.component.UserRoleUtils;
+import org.apache.myfaces.custom.calendar.HtmlCalendarRenderer;
+import org.apache.myfaces.custom.calendar.FunctionCallProvider;
+import org.apache.myfaces.custom.calendar.HtmlCalendarRenderer.CalendarDateTimeConverter;
+import org.apache.myfaces.custom.date.AbstractHtmlInputDate.UserData;
+import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
+import org.apache.myfaces.shared_tomahawk.renderkit.JSFAttr;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.util.JavascriptUtils;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils;
+import org.apache.myfaces.shared_tomahawk.util.MessageUtils;
+import org.apache.myfaces.tomahawk.application.PreRenderViewAddResourceEvent;
+
+/**
+ * @JSFRenderer
+ * renderKitId = "HTML_BASIC"
+ * family = "javax.faces.Input"
+ * type = "org.apache.myfaces.Date"
+ *
+ * @author Sylvain Vieujot (latest modification by $Author: lu4242 $)
+ * @version $Revision: 745285 $ $Date: 2009-02-17 17:52:58 -0500 (mar, 17 feb 2009) $
+ */
+@ListenerFor(systemEventClass=PreRenderViewAddResourceEvent.class)
+public class HtmlDateRenderer extends HtmlRenderer
+ implements ComponentSystemEventListener
+{
+ /**
+ * <p>The message identifier of the {@link FacesMessage} to be created if
+ * the input is not a valid date.</p>
+ */
+ public static final String DATE_MESSAGE_ID = "org.apache.myfaces.Date.INVALID";
+
+ private static final String ID_DAY_POSTFIX = ".day";
+ private static final String ID_MONTH_POSTFIX = ".month";
+ private static final String ID_YEAR_POSTFIX = ".year";
+ private static final String ID_HOURS_POSTFIX = ".hours";
+ private static final String ID_MINUTES_POSTFIX = ".minutes";
+ private static final String ID_SECONDS_POSTFIX = ".seconds";
+ private static final String ID_AMPM_POSTFIX = ".ampm";
+
+ static public String getClientIdForDaySubcomponent(String clientId)
+ {
+ return clientId + ID_DAY_POSTFIX;
+ }
+
+ public void processEvent(ComponentSystemEvent event)
+ {
+ HtmlInputDate inputDate = (HtmlInputDate) event.getComponent();
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ String type = inputDate.getType();
+ boolean disabled = isDisabled(facesContext, inputDate);
+ boolean readonly = inputDate.isReadonly();
+ if( ! (type.equals("time") || type.equals("short_time")))
+ {
+ if( inputDate.isPopupCalendar() && ! disabled && ! readonly )
+ {
+ HtmlCalendarRenderer.addScriptAndCSSResources(facesContext,inputDate);
+ }
+ }
+ }
+
+ protected boolean isDisabled(FacesContext facesContext, HtmlInputDate inputDate) {
+ if( !UserRoleUtils.isEnabledOnUserRole(inputDate) )
+ return false;
+
+ return inputDate.isDisabled();
+ }
+
+ public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) throws IOException {
+ RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputDate.class);
+
+ HtmlInputDate inputDate = (HtmlInputDate) uiComponent;
+ Locale currentLocale = facesContext.getViewRoot().getLocale();
+ UserData userData = null;
+ String type = inputDate.getType();
+ boolean ampm = inputDate.isAmpm();
+ String clientId = uiComponent.getClientId(facesContext);
+
+ if (null == inputDate.getConverter())
+ {
+ userData = (UserData) inputDate.getSubmittedValue();
+ if( userData == null )
+ userData = inputDate.getUserData(currentLocale);
+ }
+ else
+ {
+ //Use converter to get the value as string and
+ //create a UserData decoding it.
+ String value = org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.getStringValue(facesContext, inputDate);
+
+ //Create a UserData bean
+ userData = inputDate.getUserData(currentLocale);
+
+ if (null != value)
+ {
+ StringTokenizer st = new StringTokenizer(value,"\n");
+ while(st.hasMoreTokens())
+ {
+ String token = st.nextToken();
+ if (token.startsWith("year="))
+ {
+ userData.setYear(token.substring(5));
+ }
+ if (token.startsWith("month="))
+ {
+ userData.setYear(token.substring(6));
+ }
+ if (token.startsWith("day="))
+ {
+ userData.setYear(token.substring(4));
+ }
+ if (token.startsWith("hours="))
+ {
+ userData.setYear(token.substring(6));
+ }
+ if (token.startsWith("minutes="))
+ {
+ userData.setYear(token.substring(8));
+ }
+ if (token.startsWith("seconds="))
+ {
+ userData.setYear(token.substring(8));
+ }
+ if (token.startsWith("ampm="))
+ {
+ userData.setYear(token.substring(5));
+ }
+ }
+ }
+ }
+
+ boolean disabled = isDisabled(facesContext, inputDate);
+ boolean readonly = inputDate.isReadonly();
+
+ ResponseWriter writer = facesContext.getResponseWriter();
+
+ HtmlRendererUtils.writePrettyLineSeparator(facesContext);
+
+ writer.startElement(HTML.SPAN_ELEM, uiComponent);
+ writer.writeAttribute(HTML.ID_ATTR, clientId, null);
+
+ if( ! (type.equals("time") || type.equals("short_time"))){
+ encodeInputDay(inputDate, writer, clientId, userData, disabled, readonly);
+ encodeInputMonth(inputDate, writer, clientId, userData, currentLocale, disabled, readonly);
+ encodeInputYear(inputDate, writer, clientId, userData, disabled, readonly);
+
+ if( inputDate.isPopupCalendar() && ! disabled && ! readonly )
+ encodePopupCalendarButton(facesContext, uiComponent, writer, clientId, currentLocale);
+ }
+ if( type.equals("both") || type.equals("full")){
+ writer.write(" ");
+ }
+ if( ! type.equals("date")){
+ encodeInputHours(uiComponent, writer, clientId, userData, disabled, readonly);
+ writer.write(":");
+ encodeInputMinutes(uiComponent, writer, clientId, userData, disabled, readonly);
+ if (type.equals("full")|| type.equals("time")) {
+ writer.write(":");
+ encodeInputSeconds(uiComponent, writer, clientId, userData, disabled, readonly);
+ }
+ if (ampm) {
+ encodeInputAmpm(uiComponent, writer, clientId, userData, disabled, readonly, currentLocale);
+ }
+ }
+
+ writer.endElement(HTML.SPAN_ELEM);
+ }
+
+ protected void encodeInputField(UIComponent uiComponent, ResponseWriter writer, String id,
+ String value, int size, boolean disabled, boolean readonly) throws IOException {
+ writer.startElement(HTML.INPUT_ELEM, uiComponent);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.UNIVERSAL_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.EVENT_HANDLER_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.INPUT_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.COMMON_FIELD_EVENT_ATTRIBUTES);
+
+ if (disabled) {
+ writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
+ }
+ if( readonly ) {
+ writer.writeAttribute(HTML.READONLY_ATTR, Boolean.TRUE, null);
+ }
+
+ writer.writeAttribute(HTML.ID_ATTR, id, null);
+ writer.writeAttribute(HTML.NAME_ATTR, id, null);
+ writer.writeAttribute(HTML.SIZE_ATTR, Integer.toString(size), null);
+ writer.writeAttribute(HTML.MAXLENGTH_ATTR, Integer.toString(size), null);
+ if (value != null) {
+ writer.writeAttribute(HTML.VALUE_ATTR, value, null);
+ }
+ writer.endElement(HTML.INPUT_ELEM);
+ }
+
+ protected void encodeInputDay(UIComponent uiComponent, ResponseWriter writer, String clientId,
+ UserData userData, boolean disabled, boolean readonly) throws IOException {
+ encodeInputField(uiComponent, writer, getClientIdForDaySubcomponent(clientId), userData.getDay(), 2, disabled, readonly);
+ }
+
+ protected void encodeInputMonth(UIComponent uiComponent, ResponseWriter writer, String clientId, UserData userData, Locale currentLocale,
+ boolean disabled, boolean readonly) throws IOException {
+ writer.startElement(HTML.SELECT_ELEM, uiComponent);
+ writer.writeAttribute(HTML.ID_ATTR, clientId + ID_MONTH_POSTFIX, null);
+ writer.writeAttribute(HTML.NAME_ATTR, clientId + ID_MONTH_POSTFIX, null);
+ writer.writeAttribute(HTML.SIZE_ATTR, "1", null);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.UNIVERSAL_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.EVENT_HANDLER_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.COMMON_FIELD_EVENT_ATTRIBUTES);
+
+ if (disabled) {
+ writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
+ }
+ if (readonly) {
+ writer.writeAttribute(HTML.READONLY_ATTR, Boolean.TRUE, null);
+ }
+
+ int selectedMonth = userData.getMonth() == null ? -1 : Integer.parseInt(userData.getMonth())-1;
+
+ String[] months = HtmlCalendarRenderer.mapMonths(new DateFormatSymbols(currentLocale));
+ encodeEmptyInputMonthSelection(uiComponent, writer, selectedMonth);
+ for (int i = 0; i < months.length; i++) {
+ String monthName = months[i];
+ String monthNumber = Integer.toString(i+1);
+
+ writer.write("\t\t");
+ writer.startElement(HTML.OPTION_ELEM, uiComponent);
+ writer.writeAttribute(HTML.VALUE_ATTR, monthNumber, null);
+
+ if (i == selectedMonth)
+ writer.writeAttribute(HTML.SELECTED_ATTR, HTML.SELECTED_ATTR, null);
+
+ writer.writeText(monthName, null);
+
+ writer.endElement(HTML.OPTION_ELEM);
+ }
+
+ // bug #970747: force separate end tag
+ writer.writeText("", null);
+ writer.endElement(HTML.SELECT_ELEM);
+ }
+
+ protected void encodeEmptyInputMonthSelection(UIComponent component, ResponseWriter writer, int selectedMonth) throws IOException{
+ writer.startElement(HTML.OPTION_ELEM, component);
+ writer.writeAttribute(HTML.VALUE_ATTR, "-1", null);
+
+ if(selectedMonth == -1)
+ writer.writeAttribute(HTML.SELECTED_ATTR, HTML.SELECTED_ATTR, null);
+
+ writer.writeText(((HtmlInputDate)component).getEmptyMonthSelection(), null);
+ writer.endElement(HTML.OPTION_ELEM);
+ }
+
+ protected void encodeInputYear(UIComponent uiComponent, ResponseWriter writer, String clientId,
+ UserData userData, boolean disabled, boolean readonly) throws IOException {
+ encodeInputField(uiComponent, writer, clientId + ID_YEAR_POSTFIX, userData.getYear(), 4, disabled, readonly);
+ }
+
+ protected void encodeInputHours(UIComponent uiComponent, ResponseWriter writer, String clientId,
+ UserData userData, boolean disabled, boolean readonly) throws IOException {
+ encodeInputField(uiComponent, writer, clientId + ID_HOURS_POSTFIX, userData.getHours(), 2, disabled, readonly);
+ }
+
+ protected void encodeInputMinutes(UIComponent uiComponent, ResponseWriter writer, String clientId,
+ UserData userData, boolean disabled, boolean readonly) throws IOException {
+ encodeInputField(uiComponent, writer, clientId + ID_MINUTES_POSTFIX, userData.getMinutes(), 2, disabled, readonly);
+ }
+
+ protected void encodeInputSeconds(UIComponent uiComponent, ResponseWriter writer, String clientId,
+ UserData userData, boolean disabled, boolean readonly) throws IOException {
+ encodeInputField(uiComponent, writer, clientId + ID_SECONDS_POSTFIX, userData.getSeconds(), 2, disabled, readonly);
+ }
+
+ protected void encodeAmpmChoice(DateFormatSymbols symbols, UIComponent uiComponent, ResponseWriter writer, int calendar_ampm, int selected) throws IOException {
+ String[] ampm_choices = symbols.getAmPmStrings();
+ writer.write("\t\t");
+ writer.startElement(HTML.OPTION_ELEM, uiComponent);
+ writer.writeAttribute(HTML.VALUE_ATTR, new Integer(calendar_ampm), null);
+ if (calendar_ampm == selected)
+ writer.writeAttribute(HTML.SELECTED_ATTR, HTML.SELECTED_ATTR, null);
+ writer.writeText(ampm_choices[calendar_ampm], null);
+ writer.endElement(HTML.OPTION_ELEM);
+ }
+
+ protected void encodeInputAmpm(UIComponent uiComponent, ResponseWriter writer, String clientId,
+ UserData userData, boolean disabled, boolean readonly, Locale currentLocale) throws IOException {
+ writer.startElement(HTML.SELECT_ELEM, uiComponent);
+ writer.writeAttribute(HTML.ID_ATTR, clientId + ID_AMPM_POSTFIX, null);
+ writer.writeAttribute(HTML.NAME_ATTR, clientId + ID_AMPM_POSTFIX, null);
+ writer.writeAttribute(HTML.SIZE_ATTR, "1", null);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.UNIVERSAL_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.EVENT_HANDLER_ATTRIBUTES);
+ HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.COMMON_FIELD_EVENT_ATTRIBUTES);
+
+ if (disabled) {
+ writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
+ }
+ if (readonly) {
+ writer.writeAttribute(HTML.READONLY_ATTR, Boolean.TRUE, null);
+ }
+
+ DateFormatSymbols symbols = new DateFormatSymbols(currentLocale);
+
+ int selectedAmpm = userData.getAmpm() == null ? -1 : Integer.parseInt(userData.getAmpm());
+ encodeEmtypAmpmChoice(uiComponent, writer, selectedAmpm);
+ encodeAmpmChoice(symbols, uiComponent, writer, Calendar.AM, selectedAmpm);
+ encodeAmpmChoice(symbols, uiComponent, writer, Calendar.PM, selectedAmpm);
+
+
+ // bug #970747: force separate end tag
+ writer.writeText("", null);
+ writer.endElement(HTML.SELECT_ELEM);
+ }
+
+ protected void encodeEmtypAmpmChoice(UIComponent component, ResponseWriter writer, int selectedAmpm) throws IOException{
+ writer.startElement(HTML.OPTION_ELEM, component);
+ writer.writeAttribute(HTML.VALUE_ATTR, "-1", null);
+
+ if(selectedAmpm == -1)
+ writer.writeAttribute(HTML.SELECTED_ATTR, HTML.SELECTED_ATTR, null);
+
+ writer.writeText(((HtmlInputDate)component).getEmptyAmpmSelection(), null);
+ writer.endElement(HTML.OPTION_ELEM);
+ }
+
+ protected void encodePopupCalendarButton(FacesContext facesContext, UIComponent uiComponent, ResponseWriter writer, String clientId, Locale currentLocale) throws IOException{
+
+ DateFormatSymbols symbols = new DateFormatSymbols(currentLocale);
+
+ //HtmlCalendarRenderer.addScriptAndCSSResources(facesContext,uiComponent);
+
+ String calendarVar = JavascriptUtils.getValidJavascriptName(
+ uiComponent.getClientId(facesContext)+"CalendarVar",false);
+ String dateFormat = CalendarDateTimeConverter.createJSPopupFormat(facesContext, null);
+
+ String localizedLanguageScript = HtmlCalendarRenderer.getLocalizedLanguageScript(facesContext,
+ symbols,Calendar.getInstance(currentLocale).getFirstDayOfWeek(),
+ uiComponent,calendarVar);
+
+ writer.startElement(HTML.SPAN_ELEM,uiComponent);
+ writer.writeAttribute(HTML.ID_ATTR,uiComponent.getClientId(facesContext)+"Span",
+ JSFAttr.ID_ATTR);
+ writer.endElement(HTML.SPAN_ELEM);
+
+ writer.startElement(HTML.SCRIPT_ELEM,uiComponent);
+ writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
+
+ writer.writeText("var "+calendarVar+"=new org_apache_myfaces_PopupCalendar();\n",null);
+ writer.write(localizedLanguageScript);
+ writer.writeText(calendarVar+".init(document.getElementById('"+
+ uiComponent.getClientId(facesContext)+"Span"+"'));\n",null);
+
+
+ writer.endElement(HTML.SCRIPT_ELEM);
+ HtmlCalendarRenderer.getScriptBtn(writer, facesContext, uiComponent,
+ dateFormat,"...",new FunctionCallProvider(){
+ public String getFunctionCall(FacesContext facesContext, UIComponent uiComponent, String dateFormat)
+ {
+ String clientId = uiComponent.getClientId(facesContext);
+
+ String clientVar = JavascriptUtils.getValidJavascriptName(clientId+"CalendarVar",true);
+
+ return clientVar+"._popUpCalendarForInputDate('"+clientId+"','"+dateFormat+"');";
+
+ }
+ });
+ }
+
+ public void decode(FacesContext facesContext, UIComponent uiComponent) {
+ RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputDate.class);
+
+ HtmlInputDate inputDate = (HtmlInputDate) uiComponent;
+
+ if( isDisabled(facesContext, inputDate) ) // For safety, do not set the submited value if the component is disabled.
+ return;
+
+ if (null != inputDate.getConverter())
+ {
+ //Instead of use a custom object to encode data,
+ //we have to encode all info in a String, so the converter
+ //can convert it to a String if the value
+ //is invalid.
+ String clientId = inputDate.getClientId(facesContext);
+ String type = inputDate.getType();
+ Map requestMap = facesContext.getExternalContext().getRequestParameterMap();
+ StringBuffer submittedValue = new StringBuffer();
+ if( ! (type.equals( "time" ) || type.equals( "short_time" )) )
+ {
+ submittedValue.append("year=");
+ submittedValue.append((String) requestMap.get(clientId + ID_YEAR_POSTFIX) );
+ submittedValue.append("\n");
+
+ submittedValue.append("month=");
+ submittedValue.append((String) requestMap.get(clientId + ID_MONTH_POSTFIX));
+ submittedValue.append("\n");
+
+ submittedValue.append("day=");
+ submittedValue.append((String) requestMap.get(getClientIdForDaySubcomponent(clientId)) );
+ submittedValue.append("\n");
+ }
+
+ if( ! type.equals( "date" ) )
+ {
+ submittedValue.append("hours=");
+ submittedValue.append((String) requestMap.get(clientId + ID_HOURS_POSTFIX) );
+ submittedValue.append("\n");
+
+ submittedValue.append("minutes=");
+ submittedValue.append((String) requestMap.get(clientId + ID_MINUTES_POSTFIX) );
+ submittedValue.append("\n");
+
+ if (type.equals("full") || type.equals("time"))
+ {
+ submittedValue.append("seconds=");
+ submittedValue.append((String) requestMap.get(clientId + ID_SECONDS_POSTFIX) );
+ submittedValue.append("\n");
+ }
+
+ if (inputDate.isAmpm())
+ {
+ submittedValue.append("ampm=");
+ submittedValue.append((String) requestMap.get(clientId + ID_AMPM_POSTFIX) );
+ submittedValue.append("\n");
+ }
+ }
+ if (submittedValue.charAt(submittedValue.length()-1) == '\n' )
+ {
+ submittedValue.deleteCharAt(submittedValue.length()-1);
+ }
+
+ inputDate.setSubmittedValue( submittedValue.toString() );
+ }
+ else
+ {
+ //Use AbstractHtmlInputDate.UserData to save submitted value
+ Locale currentLocale = facesContext.getViewRoot().getLocale();
+ UserData userData = (UserData) inputDate.getSubmittedValue();
+ if( userData == null )
+ userData = inputDate.getUserData(currentLocale);
+
+ String clientId = inputDate.getClientId(facesContext);
+ String type = inputDate.getType();
+ Map requestMap = facesContext.getExternalContext().getRequestParameterMap();
+
+ if( ! (type.equals( "time" ) || type.equals( "short_time" )) ){
+ userData.setDay( (String) requestMap.get(getClientIdForDaySubcomponent(clientId)) );
+ userData.setMonth( (String) requestMap.get(clientId + ID_MONTH_POSTFIX) );
+ userData.setYear( (String) requestMap.get(clientId + ID_YEAR_POSTFIX) );
+ }
+
+ if( ! type.equals( "date" ) ){
+ userData.setHours( (String) requestMap.get(clientId + ID_HOURS_POSTFIX) );
+ userData.setMinutes( (String) requestMap.get(clientId + ID_MINUTES_POSTFIX) );
+ if (type.equals("full") || type.equals("time"))
+ userData.setSeconds( (String) requestMap.get(clientId + ID_SECONDS_POSTFIX) );
+
+ if (inputDate.isAmpm()) {
+ userData.setAmpm( (String) requestMap.get(clientId + ID_AMPM_POSTFIX) );
+ }
+ }
+ inputDate.setSubmittedValue( userData );
+ }
+ }
+
+ public Object getConvertedValue(FacesContext context, UIComponent uiComponent, Object submittedValue) throws ConverterException {
+
+ HtmlInputDate inputDate = (HtmlInputDate) uiComponent;
+
+ if (inputDate.getConverter() == null)
+ {
+ UserData userData = (UserData) submittedValue;
+ try {
+ return userData.parse();
+ } catch (ParseException e) {
+ Object[] args = {uiComponent.getId()};
+ throw new ConverterException(MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR, DATE_MESSAGE_ID, args));
+ }
+ }
+ else
+ {
+ if (submittedValue != null && !(submittedValue instanceof String))
+ {
+ if (RendererUtils.NOTHING.equals(submittedValue))
+ {
+ return null;
+ }
+ throw new IllegalArgumentException("Submitted value of type String for component : "
+ + RendererUtils.getPathToComponent(inputDate) + "expected");
+ }
+
+ return inputDate.getConverter().getAsObject(context, inputDate, (String) submittedValue);
+ }
+ }
+}