com.marvelution.jira.plugins.hudson.utils.DateFormatUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.marvelution.jira.plugins.hudson.utils.DateFormatUtils.java

Source

/*
 * Licensed to Marvelution under one or more contributor license 
 * agreements.  See the NOTICE file distributed with this work 
 * for additional information regarding copyright ownership.
 * Marvelution licenses this file to you 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 com.marvelution.jira.plugins.hudson.utils;

import static com.atlassian.core.util.DateUtils.*;
import static org.apache.commons.lang.time.DateFormatUtils.*;

import java.util.Calendar;
import java.util.Date;

import com.atlassian.jira.ComponentManager;
import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.jira.util.I18nHelper;

/**
 * Date Formatting Utility class
 * 
 * @author <a href="mailto:markrekveld@marvelution.com">Mark Rekveld</a>
 */
public class DateFormatUtils {

    private I18nHelper i18nHelper;
    private boolean useTimePastSinceCurrectTime = false;

    /**
     * Default Constructor, will use the {@link ComponentManager} to get the {@link I18nHelper} class
     * And will disable the 'Time Past Current Time' string formatting feature.
     */
    public DateFormatUtils() {
        i18nHelper = ComponentManager.getInstance().getJiraAuthenticationContext().getI18nHelper();
        useTimePastSinceCurrectTime = false;
    }

    /**
     * Constructor, will use the {@link JiraAuthenticationContext} to get the {@link I18nHelper} class
     * And will disable the 'Time Past Current Time' string formatting feature.
     * 
     * @param authenticationContext the {@link JiraAuthenticationContext} to use to get the {@link I18nHelper} class
     */
    public DateFormatUtils(JiraAuthenticationContext authenticationContext) {
        i18nHelper = authenticationContext.getI18nHelper();
        useTimePastSinceCurrectTime = false;
    }

    /**
     * Constructor, will use the {@link JiraAuthenticationContext} to get the {@link I18nHelper} class
     * And will enable or disable the 'Time Past Current Time' string formatting feature pending the value of the
     * boolean argument.
     * 
     * @param authenticationContext the {@link JiraAuthenticationContext} used to get the {@link I18nHelper} class
     * @param useTimePastSinceCurrectTime the 'Time Past Current Time' string formatting feature setting
     */
    public DateFormatUtils(JiraAuthenticationContext authenticationContext, boolean useTimePastSinceCurrectTime) {
        this(authenticationContext);
        this.useTimePastSinceCurrectTime = useTimePastSinceCurrectTime;
    }

    /**
     * Format the given time-stamp to a human-readable time string. If the 'Time Past Since Current Time' feature is
     * not used, then the ISO Datetime format is used to format the given timestamp
     * 
     * @param timestamp the {@link Calendar} to format
     * @return the formatted time-stamp
     */
    public String format(Calendar timestamp) {
        return format(timestamp.getTimeInMillis());
    }

    /**
     * Format the given time-stamp to a human-readable time string. If the 'Time Past Since Current Time' feature is
     * not used, then the ISO Datetime format is used to format the given timestamp
     * 
     * @param timestamp the {@link Date} to format
     * @return the formatted time-stamp
     */
    public String format(Date timestamp) {
        return format(timestamp.getTime());
    }

    /**
     * Format the given time-stamp to a human-readable time string. If the 'Time Past Since Current Time' feature is
     * not used, then the ISO Datetime format is used to format the given timestamp
     * 
     * @param timestamp the time-stamp to format
     * @return the formatted time-stamp
     */
    public String format(long timestamp) {
        if (useTimePastSinceCurrectTime) {
            return getPastTimeString(timestamp);
        } else {
            final Date today = Calendar.getInstance(i18nHelper.getLocale()).getTime();
            if (ISO_DATE_FORMAT.format(today).hashCode() == ISO_DATE_FORMAT.format(timestamp).hashCode()) {
                return ISO_TIME_NO_T_FORMAT.format(timestamp);
            } else {
                return ISO_DATE_FORMAT.format(timestamp);
            }
        }
    }

    /**
     * Format a given timestamp to a {@link String}
     * 
     * @param duration the timestamp in milliseconds
     * @return the formatted time {@link String}
     */
    public String getTimeSpanString(final long duration) {
        final long years = duration / YEAR_MILLIS;
        long remDuration = duration % YEAR_MILLIS;
        final long months = remDuration / MONTH_MILLIS;
        remDuration %= MONTH_MILLIS;
        final long days = remDuration / DAY_MILLIS;
        remDuration %= DAY_MILLIS;
        final long hours = remDuration / HOUR_MILLIS;
        remDuration %= HOUR_MILLIS;
        final long minutes = remDuration / MINUTE_MILLIS;
        remDuration %= MINUTE_MILLIS;
        final long seconds = remDuration / SECOND_MILLIS;
        remDuration %= SECOND_MILLIS;
        final long millisecs = remDuration;
        if (years > 0L) {
            return makeTimeSpanString(years, i18nHelper.getText("hudson.time.year", Long.valueOf(years)), months,
                    i18nHelper.getText("hudson.time.month", Long.valueOf(months)));
        } else if (months > 0L && days == 1L) {
            return makeTimeSpanString(months, i18nHelper.getText("hudson.time.month", Long.valueOf(months)), days,
                    i18nHelper.getText("hudson.time.day", Long.valueOf(days)));
        } else if (months > 0L) {
            return makeTimeSpanString(months, i18nHelper.getText("hudson.time.month", Long.valueOf(months)), days,
                    i18nHelper.getText("hudson.time.days", Long.valueOf(days)));
        } else if (days == 1L) {
            return makeTimeSpanString(days, i18nHelper.getText("hudson.time.day", Long.valueOf(days)), hours,
                    i18nHelper.getText("hudson.time.hour", Long.valueOf(hours)));
        } else if (days > 0L) {
            return makeTimeSpanString(days, i18nHelper.getText("hudson.time.days", Long.valueOf(days)), hours,
                    i18nHelper.getText("hudson.time.hour", Long.valueOf(hours)));
        } else if (hours > 0L) {
            return makeTimeSpanString(hours, i18nHelper.getText("hudson.time.hour", Long.valueOf(hours)), minutes,
                    i18nHelper.getText("hudson.time.minute", Long.valueOf(minutes)));
        } else if (minutes > 0L) {
            return makeTimeSpanString(minutes, i18nHelper.getText("hudson.time.minute", Long.valueOf(minutes)),
                    seconds, i18nHelper.getText("hudson.time.second", Long.valueOf(seconds)));
        } else if (seconds >= 10L) {
            return i18nHelper.getText("hudson.time.second", Long.valueOf(seconds));
        } else if (seconds >= 1L) {
            return i18nHelper.getText("hudson.time.second",
                    Float.valueOf((float) seconds + (float) (millisecs / 100L) / 10.0F));
        } else if (millisecs >= 100L) {
            return i18nHelper.getText("hudson.time.second", Float.valueOf((float) (millisecs / 10L) / 100.0F));
        }
        return i18nHelper.getText("hudson.time.millisecond", Long.valueOf(millisecs));
    }

    /**
     * Format a given timestamp to a {@link String}
     * 
     * @param duration the timestamp in milliseconds
     * @return the formatted time {@link String}
     */
    public String getPastTimeString(long duration) {
        return i18nHelper.getText("hudson.past.time", getTimeSpanString(getTimePastSince(duration)));
    }

    /**
     * Private final formatter called before returning the formatted
     * {@link String}
     * 
     * @param bigUnit the big time unit
     * @param bigLabel the big time unit label
     * @param smallUnit the small time unit
     * @param smallLabel the small time unit label
     * @return the formatted {@link String}
     */
    private String makeTimeSpanString(long bigUnit, String bigLabel, long smallUnit, String smallLabel) {
        String text = bigLabel;
        if (bigUnit < 10L) {
            text = text + ' ' + smallLabel;
        }
        return text;
    }

    /**
     * Gets the time past since the time
     * 
     * @param time the time in milliseconds given
     * @return the time in milliseconds that past
     */
    public long getTimePastSince(long time) {
        return Calendar.getInstance(i18nHelper.getLocale()).getTimeInMillis() - time;
    }

}