org.exoplatform.webui.utils.TimeConvertUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.webui.utils.TimeConvertUtils.java

Source

/*
 * Copyright (C) 2003-2011 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 */
package org.exoplatform.webui.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.commons.lang.ArrayUtils;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.resources.ResourceBundleService;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.webui.application.WebuiRequestContext;

/**
 * Created by The eXo Platform SAS
 * Author : Vu Duy Tu
 *          tu.duy@exoplatform.com
 * Jul 5, 2011  
 */
public class TimeConvertUtils {
    private static final Log LOG = ExoLogger.getLogger(TimeConvertUtils.class);

    public static String[] strs = new String[] { "SECOND", "MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "YEAR",
            "DECADE" };

    public static int DAY = 3;

    public static int WEEK = 4;

    public static int MONTH = 5;

    public static int YEAR = 6;

    private static float MINISECOND_OF_MINUTE = 60 * 1000.0f;

    private static float MINUTE_OF_HOUR = 60.0f;

    private static float HOUR_OF_DAY = 24.0f;

    private static float DAY_OF_WEEK = 7.0f;

    private static float WEEK_OF_MONTH = 4.35f;

    private static float MONTH_OF_YEAR = 12;

    private static float YEAR_OF_DECADE = 10.0f;

    private static Float[] timeLength = new Float[] { MINISECOND_OF_MINUTE, MINUTE_OF_HOUR, HOUR_OF_DAY,
            DAY_OF_WEEK, WEEK_OF_MONTH, MONTH_OF_YEAR, YEAR_OF_DECADE, YEAR_OF_DECADE };
    private static String JUSTNOW = "JUSTNOW";

    private static String SPACE = " ";

    private static String STR_EMPTY = "";

    private static String STR_S = "_S";

    private static String UNDERSCORE = "_";

    private static String RESOURCE_KEY = "TimeConvert.type.";

    private static String convertXTimeAgo(Date myDate) {
        float delta = (getGreenwichMeanTime().getTimeInMillis() - myDate.getTime());
        int i = 0;
        for (i = 0; (delta >= timeLength[i]) && i < timeLength.length - 1; i++) {
            delta = delta / timeLength[i];
        }
        int l = (int) delta;
        if (l < 0 || i < 1) {
            return JUSTNOW;
        }
        return new StringBuilder().append(l).append(SPACE).append(strs[i]).append((l > 1) ? STR_S : STR_EMPTY)
                .toString();
    }

    public static String convertXTimeAgo(Date myDate, String format) {
        return convertXTimeAgo(myDate, format, null);
    }

    public static String convertXTimeAgo(Date myDate, String format, Locale locale) {
        return convertXTimeAgo(myDate, format, locale, 0);
    }

    public static String convertXTimeAgo(Date myDate, String format, int limit) {
        return convertXTimeAgo(myDate, format, null, limit);
    }

    /**
     * Convert date to display string with format X time ago
     * 
     * @param myDate The object date input for convert, it must has ZoneTime is GMT+0
     * @param format The date/time format
     * @param locale The Local of current location(language/country).
     * @param limit The value set for limit convert x time ago. It must is: TimeConvertUtils.YEAR, MONTH, WEEK, DAY.
     * @return String 
     */
    public static String convertXTimeAgo(Date myDate, String format, Locale locale, int limit) {
        String[] values = convertXTimeAgo(myDate).split(SPACE);
        if (values[0].equals(JUSTNOW))
            return getResourceBundle(RESOURCE_KEY + JUSTNOW, locale);
        int i = ArrayUtils.indexOf(strs, values[1].replace(STR_S, STR_EMPTY));
        if (limit == 0 || i < limit) {
            return getMessage(getResourceBundle(RESOURCE_KEY + values[1].replace(UNDERSCORE, STR_EMPTY), locale),
                    new String[] { values[0] });
        }

        if (locale != null) {
            return getFormatDate(myDate, format, locale);
        } else {
            return getFormatDate(myDate, format);
        }
    }

    public static String getFormatDate(Date myDate, String format) {
        return getFormatDate(myDate, format, getLocale());
    }

    public static String getFormatDate(Date myDate, String format, Locale locale) {
        /* h,hh,H, m, mm, d, dd, EEE, EEEE, M, MM, MMM, MMMM, yy, yyyy */
        if (myDate == null)
            return STR_EMPTY;
        return new SimpleDateFormat(format, locale).format(myDate);
    }

    private static String getResourceBundle(String key, Locale locale) {
        if (locale == null) {
            locale = getLocale();
        }
        ResourceBundle res = null;
        RequestContext ctx = WebuiRequestContext.getCurrentInstance();
        if (ctx != null) {
            res = ctx.getApplicationResourceBundle();
        }
        // if null, try another way
        ResourceBundleService bundleService = (ResourceBundleService) ExoContainerContext.getCurrentContainer()
                .getComponentInstanceOfType(ResourceBundleService.class);
        if (res == null && bundleService != null) {
            res = bundleService.getResourceBundle("locale.commons.Commons", locale);
        }
        // still null
        if (res == null) {
            LOG.warn("Can not resource bundle by key: " + key);
            return key.substring(key.lastIndexOf(".") + 1).toLowerCase();
        }

        return res.getString(key);
    }

    private static String getMessage(String message, String[] args) {
        if (message != null && args != null) {
            String oldMes = message;
            for (int i = 0; i < args.length; i++) {
                message = message.replace("{" + i + "}", args[i]);
            }
            if (message.equals(oldMes) && args.length == 1) {
                message = args[0] + SPACE + message;
            }
        }
        return message;
    }

    /**
     * Get current {@link Locale}
     * @return {@link Locale} 
     */
    public static Locale getLocale() {
        RequestContext ctx = WebuiRequestContext.getCurrentInstance();
        if (ctx == null) {
            return Locale.ENGLISH;
        }

        Locale locale = ctx.getLocale();
        if (locale == null) {
            return Locale.ENGLISH;
        }

        return locale;
    }

    /**
     * Get current time GMT/Zulu or UTC,(zone time is 0+GMT)
     * @return Calendar 
     */
    public static Calendar getGreenwichMeanTime() {
        Calendar calendar = GregorianCalendar.getInstance();
        calendar.setLenient(false);
        int gmtoffset = calendar.get(Calendar.DST_OFFSET) + calendar.get(Calendar.ZONE_OFFSET);
        calendar.setTimeInMillis(System.currentTimeMillis() - gmtoffset);
        return calendar;
    }
}