freenet.support.TimeUtil.java Source code

Java tutorial

Introduction

Here is the source code for freenet.support.TimeUtil.java

Source

    /*
      TimeUtil.java / Freenet
      Copyright (C) 2005-2006 The Free Network project
      This program is free software; you can redistribute it and/or
      modify it under the terms of the GNU General Public License as
      published by the Free Software Foundation; either version 2 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, write to the Free Software
      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    */

    //package freenet.support;

import java.text.DecimalFormat;

    /**
     * Time formatting utility.
     * Formats milliseconds into a week/day/hour/second/milliseconds string.
     */
    public class TimeUtil {

        /**
         * It converts a given time interval into a 
         * week/day/hour/second.milliseconds string.
         * @param timeInterval interval to convert
         * @param maxTerms the terms number to display
         * (e.g. 2 means "h" and "m" if the time could be expressed in hour,
         * 3 means "h","m","s" in the same example).
         * The maximum terms number available is 6
         * @param withSecondFractions if true it displays seconds.milliseconds
         * @return the formatted String
         */
        public static String formatTime(long timeInterval, int maxTerms, boolean withSecondFractions) {

            if (maxTerms > 6)
                throw new IllegalArgumentException();

            StringBuilder sb = new StringBuilder(64);
            long l = timeInterval;
            int termCount = 0;
            //
            if (l < 0) {
                sb.append('-');
                l = l * -1;
            }
            if (!withSecondFractions && l < 1000) {
                return "0";
            }
            if (termCount >= maxTerms) {
                return sb.toString();
            }
            //
            long weeks = (l / (7L * 24 * 60 * 60 * 1000));
            if (weeks > 0) {
                sb.append(weeks).append('w');
                termCount++;
                l = l - (weeks * (7L * 24 * 60 * 60 * 1000));
            }
            if (termCount >= maxTerms) {
                return sb.toString();
            }
            //
            long days = (l / (24L * 60 * 60 * 1000));
            if (days > 0) {
                sb.append(days).append('d');
                termCount++;
                l = l - (days * (24L * 60 * 60 * 1000));
            }
            if (termCount >= maxTerms) {
                return sb.toString();
            }
            //
            long hours = (l / (60L * 60 * 1000));
            if (hours > 0) {
                sb.append(hours).append('h');
                termCount++;
                l = l - (hours * (60L * 60 * 1000));
            }
            if (termCount >= maxTerms) {
                return sb.toString();
            }
            //
            long minutes = (l / (60L * 1000));
            if (minutes > 0) {
                sb.append(minutes).append('m');
                termCount++;
                l = l - (minutes * (60L * 1000));
            }
            if (termCount >= maxTerms) {
                return sb.toString();
            }
            if (withSecondFractions && ((maxTerms - termCount) >= 2)) {
                if (l > 0) {
                    double fractionalSeconds = l / (1000.0D);
                    DecimalFormat fix3 = new DecimalFormat("0.000");
                    sb.append(fix3.format(fractionalSeconds)).append('s');
                    termCount++;
                    //l = l - ((long)fractionalSeconds * (long)1000);
                }
            } else {
                long seconds = (l / 1000L);
                if (seconds > 0) {
                    sb.append(seconds).append('s');
                    termCount++;
                    //l = l - ((long)seconds * (long)1000);
                }
            }
            //
            return sb.toString();
        }

        public static String formatTime(long timeInterval) {
            return formatTime(timeInterval, 2, false);
        }

        public static String formatTime(long timeInterval, int maxTerms) {
            return formatTime(timeInterval, maxTerms, false);
        }
    }
    /*
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 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, write to the Free Software
     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     */
    package freenet.support;

    import java.util.Locale;

    import junit.framework.TestCase;

    /**
     * Test case for {@link freenet.support.TimeUtil} class.
     * 
     * @author Alberto Bacchelli &lt;sback@freenetproject.org&gt;
     */
    public class TimeUtilTest extends TestCase {

        //1w+1d+1h+1m+1s+1ms
        private long oneForTermLong = 694861001;

        @Override
        protected void setUp() throws Exception {
            Locale.setDefault(Locale.US);
        }

        /**
         * Tests formatTime(long,int,boolean) method
         * trying the biggest long value
         */
        public void testFormatTime_LongIntBoolean_MaxValue() {
            String expectedForMaxLongValue = "15250284452w3d7h12m55.807s";
            assertEquals(TimeUtil.formatTime(Long.MAX_VALUE, 6, true), expectedForMaxLongValue);
        }

        /**
         * Tests formatTime(long,int) method
         * trying the biggest long value
         */
        public void testFormatTime_LongInt() {
            String expectedForMaxLongValue = "15250284452w3d7h12m55s";
            assertEquals(TimeUtil.formatTime(Long.MAX_VALUE, 6), expectedForMaxLongValue);
        }

        /**
         * Tests formatTime(long) method
         * trying the biggest long value
         */
        public void testFormatTime_Long() {
            //it uses two terms by default
            String expectedForMaxLongValue = "15250284452w3d";
            assertEquals(TimeUtil.formatTime(Long.MAX_VALUE), expectedForMaxLongValue);
        }

        /**
         * Tests formatTime(long) method
         * using known values.
         * They could be checked using Google Calculator
         * http://www.google.com/intl/en/help/features.html#calculator
         */
        public void testFormatTime_KnownValues() {
            Long methodLong;
            String[][] valAndExpected = {
                    //one week
                    { "604800000", "1w" },
                    //one day
                    { "86400000", "1d" },
                    //one hour
                    { "3600000", "1h" },
                    //one minute
                    { "60000", "1m" },
                    //one second
                    { "1000", "1s" } };
            for (int i = 0; i < valAndExpected.length; i++) {
                methodLong = Long.valueOf(valAndExpected[i][0]);
                assertEquals(TimeUtil.formatTime(methodLong.longValue()), valAndExpected[i][1]);
            }
        }

        /**
         * Tests formatTime(long,int) method
         * using a long value that generate every possible
         * term kind. It tests if the maxTerms arguments
         * works correctly
         */
        public void testFormatTime_LongIntBoolean_maxTerms() {
            String[] valAndExpected = {
                    //0 terms
                    "",
                    //1 term
                    "1w",
                    //2 terms
                    "1w1d",
                    //3 terms
                    "1w1d1h",
                    //4 terms
                    "1w1d1h1m",
                    //5 terms
                    "1w1d1h1m1s",
                    //6 terms
                    "1w1d1h1m1.001s" };
            for (int i = 0; i < valAndExpected.length; i++)
                assertEquals(TimeUtil.formatTime(oneForTermLong, i, true), valAndExpected[i]);
        }

        /**
         * Tests formatTime(long,int) method
         * using one millisecond time interval. 
         * It tests if the withSecondFractions argument
         * works correctly
         */
        public void testFormatTime_LongIntBoolean_milliseconds() {
            long methodValue = 1; //1ms
            assertEquals(TimeUtil.formatTime(methodValue, 6, false), "0");
            assertEquals(TimeUtil.formatTime(methodValue, 6, true), "0.001s");
        }

        /**
         * Tests formatTime(long,int) method
         * using a long value that generate every possible
         * term kind. It tests if the maxTerms arguments
         * works correctly
         */
        public void testFormatTime_LongIntBoolean_tooManyTerms() {
            try {
                TimeUtil.formatTime(oneForTermLong, 7);
                fail("Expected IllegalArgumentException not thrown");
            } catch (IllegalArgumentException anException) {
                assertNotNull(anException);
            }
        }

    }