org.zkoss.bind.converter.FormattedTimeConverter Maven / Gradle / Ivy
/* FormatedTimeConverter.java
Purpose:
Description:
History:
Mar 20, 2015 12:30:00 PM, Created by jameschu
Copyright (C) 2015 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.bind.converter;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.zkoss.bind.BindContext;
import org.zkoss.bind.Converter;
import org.zkoss.bind.sys.Binding;
import org.zkoss.bind.sys.PropertyBinding;
import org.zkoss.util.Locales;
import org.zkoss.util.TimeZones;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.UiException;
/**
* Converter to convert String to Time (Date Object).
* @author JamesChu
* @since 8.0.0
*/
public class FormattedTimeConverter implements Converter, Serializable {
private static final long serialVersionUID = 3505731684878632094L;
/**
* Convert Date to String.
* @param val date to be converted
* @param comp associated component
* @param ctx bind context for associate {@link Binding} and extra parameter (e.g. format)
* @return the converted String
*/
public Object coerceToUi(Object val, Component comp, BindContext ctx) {
//user sets format in annotation of binding or args when calling binder.addPropertyBinding()
final String format = (String) ctx.getConverterArg("format");
if (format == null)
throw new NullPointerException("format attribute not found");
final Date date = (Date) val;
return date == null ? null : getLocalizedSimpleDateFormat(format).format(date);
}
/**
* Convert String to Date.
* @param val date in string form
* @param comp associated component
* @param ctx bind context for associate {@link Binding} and extra parameter (e.g. format)
* @return the converted Date
*/
public Object coerceToBean(Object val, Component comp, BindContext ctx) {
final String format = (String) ctx.getConverterArg("format");
if (format == null)
throw new NullPointerException("format attribute not found");
final String dateStr = (String) val;
try {
Date newDate = dateStr == null ? null : getLocalizedSimpleDateFormat(format).parse(dateStr);
if (newDate != null) {
Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZones.getCurrent());
cal.setTime(newDate);
Binding b = ctx.getBinding();
if (b instanceof PropertyBinding) {
int h = cal.get(Calendar.HOUR_OF_DAY), m = cal.get(Calendar.MINUTE), s = cal.get(Calendar.SECOND),
ms = cal.get(Calendar.MILLISECOND);
Object value = ctx.getBinder().getEvaluatorX().getValue(ctx, comp,
((PropertyBinding) b).getProperty());
Date oldDate = new Date();
if (value instanceof Date)
oldDate = (Date) value;
else if (value instanceof Long) {
cal.setTimeInMillis((Long) value);
oldDate = cal.getTime();
}
cal.setTime(oldDate);
cal.set(Calendar.HOUR_OF_DAY, h);
cal.set(Calendar.MINUTE, m);
cal.set(Calendar.SECOND, s);
cal.set(Calendar.MILLISECOND, ms);
newDate = cal.getTime();
}
}
return newDate;
} catch (ParseException e) {
throw UiException.Aide.wrap(e);
}
}
private static SimpleDateFormat getLocalizedSimpleDateFormat(String formatPtn) {
SimpleDateFormat sdf = new SimpleDateFormat(formatPtn, Locales.getCurrent());
sdf.setTimeZone(TimeZones.getCurrent());
return sdf;
}
}