org.richfaces.utils.CalendarHelper Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source
* Copyright 2010, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.utils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.DateTimeConverter;
import org.richfaces.component.AbstractCalendar;
/**
* @author amarkhel
*
*/
public final class CalendarHelper {
protected CalendarHelper() {
}
public static Date getAsDate(FacesContext facesContext, AbstractCalendar calendar, Object date) {
if (date == null) {
return null;
}
Date value = null;
Converter converter = calendar.getConverter();
if (converter == null) {
Application application = facesContext.getApplication();
converter = application.createConverter(date.getClass());
}
if (date instanceof Date) {
value = (Date) date;
} else if (date instanceof Calendar) {
value = ((Calendar) date).getTime();
} else if (converter != null) {
value = convertStringToDate(facesContext, calendar, converter.getAsString(facesContext, calendar, date));
} else if (date instanceof String) {
value = convertStringToDate(facesContext, calendar, (String) date);
} else {
throw new FacesException("Wrong attibute type or there is no converter for custom attibute type");
}
return value;
}
public static Date getFormattedDefaultTime(AbstractCalendar calendar) {
if (calendar == null || calendar.getDefaultTime() == null) {
return null;
}
Object defaultTime = calendar.getDefaultTime();
if (defaultTime == null) {
defaultTime = AbstractCalendar.getDefaultValueOfDefaultTime(null, null);
}
Date result = null;
if (defaultTime instanceof Calendar) {
result = ((Calendar) defaultTime).getTime();
} else if (defaultTime instanceof Date) {
result = (Date) defaultTime;
} else {
String defaultTimeString = defaultTime.toString();
String datePattern = getDatePatternOrDefault(calendar);
Pattern pattern = Pattern.compile(AbstractCalendar.SUB_TIME_PATTERN);
Matcher matcher = pattern.matcher(datePattern);
String subTimePattern = AbstractCalendar.TIME_PATTERN;
if (matcher.find()) {
subTimePattern = matcher.group().trim();
}
DateFormat format = new SimpleDateFormat(subTimePattern);
try {
result = format.parse(defaultTimeString);
} catch (ParseException parseException) {
// log??
result = null;
}
}
return result;
}
public static Locale getAsLocale(FacesContext facesContext, UIComponent component) {
AbstractCalendar calendar = (AbstractCalendar) component;
if (calendar == null || facesContext == null) {
return null;
}
Object locale = calendar.getLocale();
return getAsLocale(facesContext, calendar, locale);
}
public static Locale getAsLocale(FacesContext facesContext, AbstractCalendar calendar, Object locale) {
if (calendar == null || facesContext == null) {
return null;
}
Locale localeValue = null;
if (locale instanceof Locale) {
localeValue = (Locale) locale;
} else if (locale instanceof String) {
localeValue = parseLocale((String) locale);
} else if (locale != null) {
Application application = facesContext.getApplication();
Converter converter = application.createConverter(locale.getClass());
if (null != converter) {
localeValue = parseLocale(converter.getAsString(facesContext, calendar, locale));
} else {
throw new FacesException("Wrong locale attibute type or there is no converter for custom attibute type");
}
}
return localeValue;
}
public static Locale parseLocale(String localeStr) {
if (null == localeStr || localeStr.trim().length() < 2) {
return Locale.getDefault();
}
// Lookup index of first '_' in string locale representation.
int index1 = localeStr.indexOf("_");
// Get first charters (if exist) from string
String language = null;
if (index1 != -1) {
language = localeStr.substring(0, index1);
} else {
return new Locale(localeStr);
}
// Lookup index of second '_' in string locale representation.
int index2 = localeStr.indexOf("_", index1 + 1);
String country = null;
if (index2 != -1) {
country = localeStr.substring(index1 + 1, index2);
String variant = localeStr.substring(index2 + 1);
return new Locale(language, country, variant);
} else {
country = localeStr.substring(index1 + 1);
return new Locale(language, country);
}
}
public static Date convertCurrentDate(String currentDateString, FacesContext facesContext, AbstractCalendar calendar) {
Calendar calendarInner = getCalendar(facesContext, calendar);
calendarInner.clear();
calendarInner.set(Calendar.DATE, 1);
int idx = currentDateString.indexOf('/');
Date date = null;
if (idx != -1) {
calendarInner.set(Calendar.MONTH, Integer.parseInt(currentDateString.substring(0, idx)) - 1);
calendarInner.set(Calendar.YEAR, Integer.parseInt(currentDateString.substring(idx + 1)));
date = calendarInner.getTime();
}
return date;
}
public static Calendar getCalendar(FacesContext facesContext, AbstractCalendar calendar) {
if (calendar == null || facesContext == null) {
return Calendar.getInstance();
}
return Calendar.getInstance(getTimeZoneOrDefault(calendar), getAsLocale(facesContext, calendar));
}
public static Date convertStringToDate(FacesContext facesContext, AbstractCalendar calendar, String date) {
DateTimeConverter converter = new DateTimeConverter();
converter.setPattern(getDatePatternOrDefault(calendar));
converter.setLocale(getAsLocale(facesContext, calendar));
converter.setTimeZone(getTimeZoneOrDefault(calendar));
return (Date) converter.getAsObject(facesContext, calendar, date);
}
public static Date getCurrentDateOrDefault(FacesContext facesContext, AbstractCalendar calendar) {
if (calendar == null || facesContext == null) {
return null;
}
Date date = getAsDate(facesContext, calendar, calendar.getCurrentDate());
if (date == null) {
date = getAsDate(facesContext, calendar, calendar.getValue());
}
if (date == null) {
date = getCalendar(facesContext, calendar).getTime();
}
return date;
}
public static TimeZone getTimeZoneOrDefault(AbstractCalendar calendar) {
TimeZone value = calendar.getTimeZone();
if (value == null) {
value = TimeZone.getDefault();
}
return value;
}
public static String getDatePatternOrDefault(AbstractCalendar calendar) {
String value = calendar.getDatePattern();
if (value == null || "".equals(value)) {
value = "MMM d, yyyy";
}
return value;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy