/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.explorer.util.time;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.Messages;
import org.activiti.explorer.util.time.timeunit.DayTimeUnit;
import org.activiti.explorer.util.time.timeunit.HourTimeUnit;
import org.activiti.explorer.util.time.timeunit.MinuteTimeUnit;
import org.activiti.explorer.util.time.timeunit.MonthTimeUnit;
import org.activiti.explorer.util.time.timeunit.WeekTimeUnit;
import org.activiti.explorer.util.time.timeunit.YearTimeUnit;
/**
* @author Frederik Heremans
*/
public class HumanTime {
private static final List<TimeUnit> timeUnits = Arrays.asList(
new YearTimeUnit(),
new MonthTimeUnit(),
new WeekTimeUnit(),
new DayTimeUnit(),
new HourTimeUnit(),
new MinuteTimeUnit()
);
private Long baseDate;
private I18nManager i18nManager;
/**
* Create human time, relative to current time.
*/
public HumanTime(I18nManager i18nManager) {
this(null, i18nManager);
}
/**
* Create human time, relative to the given date.
*/
public HumanTime(Date date, I18nManager i18nManager) {
if(i18nManager == null) {
throw new IllegalArgumentException("I18NManager is required!");
}
this.i18nManager = i18nManager;
if(date != null) {
baseDate = date.getTime();
} else {
baseDate = new Date().getTime();
}
}
/**
* Returns the human readable string of the duration between
* the given date and the base date.
*/
public String format(Date date) {
boolean future = true;
Long difference = date.getTime() - baseDate;
if(difference < 0) {
future = false;
difference = -difference;
} else if(difference == 0) {
return i18nManager.getMessage(Messages.TIME_UNIT_JUST_NOW);
}
String unitMessage = getUnitMessage(difference);
String messageKey = null;
if(future) {
messageKey = Messages.TIME_UNIT_FUTURE;
} else {
messageKey = Messages.TIME_UNIT_PAST;
}
return i18nManager.getMessage(messageKey, unitMessage);
}
private String getUnitMessage(Long difference) {
String unitMessage = null;
TimeUnit unitToUse = null;
TimeUnit currentUnit = null;
for(int i=0; i<timeUnits.size() && unitToUse == null; i++) {
currentUnit = timeUnits.get(i);
if(currentUnit.getNumberOfMillis() <= difference) {
unitToUse = currentUnit;
}
}
if(unitToUse == null) {
// No unit found, so use "moments ago" of "moments from now"
unitMessage = i18nManager.getMessage(Messages.TIME_UNIT_MOMENTS);
} else {
// Calculate number of units
Long numberOfUnits = (difference - (difference%unitToUse.getNumberOfMillis())) / unitToUse.getNumberOfMillis();
unitMessage = i18nManager.getMessage(unitToUse.getMessageKey(numberOfUnits), numberOfUnits);
}
return unitMessage;
}
}