package de.flower.rmt.util.prettytime;
import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* Pretty formatting of dates. Inspired by com.ocpsoft.pretty.time.PrettyTime.
* Adds support for Today and Yesterday.
*
* @author flowerrrr
*/
public class PrettyTime {
// use same locale lookup as in DateFormat.xxxx
private Locale locale = Locale.getDefault(Locale.Category.FORMAT);
private List<IDateHandler> handlers = new ArrayList<>();
private Date reference = new Date();
public PrettyTime() {
initHandlers();
}
public PrettyTime(final Date reference) {
this();
this.reference = reference;
}
private void initHandlers() {
handlers.add(new AbstractDateHandler.JustNow(locale));
handlers.add(new AbstractDateHandler.Minute(locale));
handlers.add(new AbstractDateHandler.Hour(locale));
handlers.add(new AbstractDateHandler.Today(locale));
handlers.add(new AbstractDateHandler.Yesterday(locale));
handlers.add(new AbstractDateHandler.Week(locale));
}
public String format(final Date date) {
IDateHandler dateHandler = getDateHandler(date);
return dateHandler.format(date, getDelta(date));
}
private IDateHandler getDateHandler(final Date date, final long delta) {
for (IDateHandler handler : handlers) {
if (handler.canHandle(date, delta)) {
return handler;
}
}
return new AbstractDateHandler.Default(locale);
}
@VisibleForTesting
protected IDateHandler getDateHandler(final Date date) {
return getDateHandler(date, getDelta(date));
}
private long getDelta(Date date) {
return reference.getTime() - date.getTime();
}
}