// ======================================================================== // Copyright (C) zeroth Project Team. All rights reserved. // GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 // http://www.gnu.org/licenses/agpl-3.0.txt // ======================================================================== package zeroth.actor.screen.iface.jsf.converter; import java.text.MessageFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; import javax.faces.convert.FacesConverter; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; import zeroth.framework.screen.iface.jsf.FacesHelper; /** * Date converter. * @author nilcy */ @FacesConverter(value = "dateConverter") public class DateConverter implements Converter { /** formal patter. */ private static final String FORMAL_PATTERN = "yyyy/MM/dd"; /** length of MMDD. */ private static final int LENGTH_MMDD = 4; /** length of DD. */ private static final int LENGTH_DD = 2; /** コンストラクタ */ public DateConverter() { super(); } @Override public Object getAsObject(final FacesContext aContext, final UIComponent aUIComponent, final String aParam) { if (StringUtils.isEmpty(aParam)) { return null; } try { return createDate(StringUtils.trimToEmpty(aParam)); } catch (final ParseException e) { final String msg = MessageFormat.format(FacesHelper .getBundleMessage("zeroth.actor.screen.iface.jsf.converter.DateConverter"), aParam, "YYYY/MM/DD, YYYYMMDD, YYMMDD, MMDD, DD"); throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg)); } } @Override public String getAsString(final FacesContext aContext, final UIComponent aUIComponent, final Object aObject) { if (aObject == null) { return null; } return DateFormatUtils.format((Date) aObject, FORMAL_PATTERN); } /** * Create date. * @param aDateText date text * @return created date * @throws ParseException parse exception */ private static Date createDate(final String aDateText) throws ParseException { final Calendar cal = Calendar.getInstance(); final Date now = cal.getTime(); Date date = DateUtils.parseDateStrictly(aDateText, new String[] { FORMAL_PATTERN, "yyyyMMdd", "yyMMdd", "MMdd", "dd" }); if (aDateText.length() == LENGTH_MMDD) { date = DateUtils.setYears(date, cal.get(Calendar.YEAR)); if (date.before(now)) { date = DateUtils.addYears(date, 1); } } else if (aDateText.length() == LENGTH_DD) { date = DateUtils.setYears(date, cal.get(Calendar.YEAR)); date = DateUtils.setMonths(date, cal.get(Calendar.MONTH)); if (date.before(now)) { date = DateUtils.addMonths(date, 1); } } return date; } }