package de.flower.rmt.util.prettytime;
import de.flower.rmt.util.Dates;
import de.flower.rmt.util.prettytime.i18n.Resources;
import org.joda.time.DateTime;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;
/**
* @author flowerrrr
*/
public abstract class AbstractDateHandler implements IDateHandler {
private ResourceBundle bundle;
protected Locale locale;
public AbstractDateHandler(Locale locale) {
// Resource bundles need to be in the given package, names start with
// 'Resources', e.g. 'Resources_de.java'
this.locale = locale;
this.bundle = ResourceBundle.getBundle(Resources.class.getName(), locale);
}
protected final String format(String resourceKey, Object... args) {
String pattern = bundle.getString(resourceKey);
return MessageFormat.format(pattern, args);
}
protected final String getPlural(long value) {
return (value > 1) ? "Plural" : "";
}
public static boolean isSameDay(final DateTime d1, final DateTime d2) {
return (d1.dayOfYear().equals(d2.dayOfYear()) && d1.year().equals(d2.year()));
}
public static class JustNow extends AbstractDateHandler {
public JustNow(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
long deltaMinutes = TimeUnit.MILLISECONDS.toMinutes(delta);
return (deltaMinutes < 1) ? true : false;
}
@Override
public String format(final Date date, final long delta) {
return format("JustNowPastPattern");
}
}
public static class Minute extends AbstractDateHandler {
public Minute(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
long deltaMinutes = TimeUnit.MILLISECONDS.toMinutes(delta);
return (deltaMinutes < 60) ? true : false;
}
@Override
public String format(final Date date, final long delta) {
long minutes = TimeUnit.MILLISECONDS.toMinutes(delta);
return format("MinutePastPattern" + getPlural(minutes), minutes);
}
}
public static class Hour extends AbstractDateHandler {
public Hour(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
long deltaHours = TimeUnit.MILLISECONDS.toHours(delta);
return (deltaHours <= 12) ? true : false;
}
@Override
public String format(final Date date, final long delta) {
long hours = TimeUnit.MILLISECONDS.toHours(delta);
return format("HourPastPattern" + getPlural(hours), hours);
}
}
public static class Today extends AbstractDateHandler {
public Today(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
DateTime referenceDate = new DateTime(date).plus(delta);
DateTime jDate = new DateTime(date);
return isSameDay(referenceDate, jDate);
}
@Override
public String format(final Date date, final long delta) {
return format("TodayPattern", Dates.formatTimeShort(date));
}
}
public static class Yesterday extends AbstractDateHandler {
public Yesterday(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
DateTime referenceDate = new DateTime(date).plus(delta);
DateTime yesterDay = referenceDate.minusDays(1);
DateTime jDate = new DateTime(date);
return (isSameDay(yesterDay, jDate));
}
@Override
public String format(final Date date, final long delta) {
return format("YesterdayPattern", Dates.formatTimeShort(date));
}
}
public static class Week extends AbstractDateHandler {
public Week(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
long deltaDays = TimeUnit.MILLISECONDS.toDays(delta);
return (deltaDays <= 6) ? true : false;
}
@Override
public String format(final Date date, final long delta) {
String sDay = new SimpleDateFormat("EEEE", locale).format(date);
return format("WeekPattern", sDay, Dates.formatTimeShort(date));
}
}
public static class Default extends AbstractDateHandler {
public Default(Locale locale) {
super(locale);
}
@Override
public boolean canHandle(final Date date, final long delta) {
return true;
}
@Override
public String format(final Date date, final long delta) {
return format("DefaultPattern", Dates.formatDateLong(date), Dates.formatTimeShort(date));
}
}
}