/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.web.beans;
import java.util.HashMap;
import java.util.Locale;
import org.esupportail.commons.services.i18n.I18nService;
import org.esupportail.commons.utils.Assert;
import org.esupportail.helpdesk.web.controllers.SessionController;
import org.springframework.beans.factory.InitializingBean;
/**
* A formatter for elapsed times.
*/
public class ElapsedTimeI18nFormatter
extends HashMap<Integer, String>
implements InitializingBean {
/**
* The serialization id.
*/
private static final long serialVersionUID = 9104759717540503778L;
/**
* Magic number.
*/
private static final int SECONDS_PER_MINUTE = 60;
/**
* Magic number.
*/
private static final int MINUTES_PER_HOUR = 60;
/**
* Magic number.
*/
private static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
/**
* Magic number.
*/
private static final int HOURS_PER_DAY = 24;
/**
* Magic number.
*/
private static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;
/**
* Magic number.
*/
private static final int DAYS_PER_WEEK = 7;
/**
* Magic number.
*/
private static final int SECONDS_PER_WEEK = SECONDS_PER_DAY * DAYS_PER_WEEK;
/**
* Magic number.
*/
private static final int DAYS_PER_MONTH = 30;
/**
* Magic number.
*/
private static final int SECONDS_PER_MONTH = SECONDS_PER_DAY * DAYS_PER_MONTH;
/**
* Magic number.
*/
private static final int DAYS_PER_YEAR = 365;
/**
* Magic number.
*/
private static final int SECONDS_PER_YEAR = SECONDS_PER_DAY * DAYS_PER_YEAR;
/**
* Magic number.
*/
private static final int STEP = 5;
/**
* The i18n service.
*/
private I18nService i18nService;
/**
* The session controller.
*/
private SessionController sessionController;
/**
* Bean constructor.
*/
public ElapsedTimeI18nFormatter() {
super();
}
/**
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() {
Assert.notNull(sessionController,
"property sessionController of class " + this.getClass().getName()
+ " can not be null");
Assert.notNull(i18nService,
"property i18nService of class " + this.getClass().getName()
+ " can not be null");
}
/**
* @param i
* @return the years part
*/
protected static Integer getYears(final Long i) {
if (i == null) {
return null;
}
return new Long(i / SECONDS_PER_YEAR).intValue();
}
/**
* @param i
* @return the months part
*/
protected static Integer getMonths(final Long i) {
if (i == null) {
return null;
}
return new Long((i - (getYears(i) * SECONDS_PER_YEAR)) / SECONDS_PER_MONTH).intValue();
}
/**
* @param i
* @return the weeks part
*/
protected static Integer getWeeks(final Long i) {
if (i == null) {
return null;
}
return new Long((i - (getYears(i) * SECONDS_PER_YEAR) - (getMonths(i) * SECONDS_PER_MONTH))
/ SECONDS_PER_WEEK).intValue();
}
/**
* @param i
* @return the days part
*/
protected static Integer getDays(final Long i) {
if (i == null) {
return null;
}
return new Long((i / SECONDS_PER_DAY) % DAYS_PER_WEEK).intValue();
}
/**
* @param i
* @return the hours part
*/
protected static Integer getHours(final Long i) {
if (i == null) {
return null;
}
return new Long((i / SECONDS_PER_HOUR) % HOURS_PER_DAY).intValue();
}
/**
* @param i
* @return the minutes part
*/
protected static Integer getMinutes(final Long i) {
if (i == null) {
return null;
}
return new Long((i / SECONDS_PER_MINUTE) % MINUTES_PER_HOUR).intValue();
}
/**
* @param i
* @return the minutes part
*/
protected static Integer getSeconds(final Long i) {
if (i == null) {
return null;
}
return new Long(i % SECONDS_PER_MINUTE).intValue();
}
/**
* @param service
* @param value
* @param locale
* @return a formatted elapsed time.
*/
public static String format(
final I18nService service,
final Object value,
final Locale locale) {
if (value == null) {
return service.getString("ELAPSED_TIME.NULL", locale);
}
Long time = Long.valueOf(value.toString());
if (time < SECONDS_PER_MINUTE) {
Integer seconds = getSeconds(time);
return service.getString("ELAPSED_TIME.SECONDS", locale, seconds);
}
if (time < SECONDS_PER_HOUR) {
Integer minutes = getMinutes(time);
Integer seconds = getSeconds(time);
if (minutes < STEP && seconds != 0) {
return service.getString("ELAPSED_TIME.MINUTES_SECONDS", locale, minutes, seconds);
}
return service.getString("ELAPSED_TIME.MINUTES", locale, minutes);
}
if (time < SECONDS_PER_DAY) {
Integer hours = getHours(time);
Integer minutes = getMinutes(time);
if (hours < STEP && minutes != 0) {
return service.getString("ELAPSED_TIME.HOURS_MINUTES", locale, hours, minutes);
}
return service.getString("ELAPSED_TIME.HOURS", locale, hours);
}
if (time < SECONDS_PER_WEEK) {
Integer days = getDays(time);
Integer hours = getHours(time);
if (days < STEP && hours != 0) {
return service.getString("ELAPSED_TIME.DAYS_HOURS", locale, days, hours);
}
return service.getString("ELAPSED_TIME.DAYS", locale, days);
}
if (time < SECONDS_PER_MONTH) {
Integer weeks = getWeeks(time);
Integer days = getDays(time);
if (weeks < STEP && days != 0) {
return service.getString("ELAPSED_TIME.WEEKS_DAYS", locale, weeks, days);
}
return service.getString("ELAPSED_TIME.WEEKS", locale, weeks);
}
if (time < SECONDS_PER_YEAR) {
Integer months = getMonths(time);
Integer weeks = getWeeks(time);
if (months < STEP && weeks != 0) {
return service.getString("ELAPSED_TIME.MONTHS_WEEKS", locale, months, weeks);
}
return service.getString("ELAPSED_TIME.MONTHS", locale, months);
}
Integer years = getYears(time);
Integer months = getMonths(time);
if (years < STEP && months != 0) {
return service.getString("ELAPSED_TIME.YEARS_MONTHS", locale, years, months);
}
return service.getString("ELAPSED_TIME.YEARS", locale, years);
}
/**
* @see java.util.HashMap#get(java.lang.Object)
*/
@Override
public String get(final Object o) {
return format(i18nService, o, sessionController.getLocale());
}
/**
* @return the sessionController
*/
protected SessionController getSessionController() {
return sessionController;
}
/**
* @param sessionController the sessionController to set
*/
public void setSessionController(final SessionController sessionController) {
this.sessionController = sessionController;
}
/**
* @return the i18nService
*/
protected I18nService getI18nService() {
return i18nService;
}
/**
* @param service the i18nService to set
*/
public void setI18nService(final I18nService service) {
i18nService = service;
}
}