001package co.codewizards.cloudstore.core;
002
003import java.util.ArrayList;
004import java.util.Arrays;
005import java.util.Collections;
006import java.util.List;
007import java.util.ListIterator;
008
009/**
010 * Units based on <a target="_blank" href="http://en.wikipedia.org/wiki/ISO_31-1">ISO 31-1</a> (where it exists).
011 *
012 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
013 */
014public enum TimeUnit {
015        /**
016         * Millisecond.
017         */
018        ms("Millisecond", 1L),
019
020        /**
021         * Second.
022         */
023        s("Second", 1000L),
024
025        /**
026         * Minute.
027         */
028        min("Minute", 60L * s.msec),
029
030        /**
031         * Hour.
032         */
033        h("Hour", 60L * min.msec),
034
035        /**
036         * Day.
037         */
038        d("Day", 24L * h.msec),
039
040        /**
041         * Year. <a target="_blank" href="http://en.wikipedia.org/wiki/Year">Abbreviation from latin "annus".</a>
042         */
043        a("Year", 365L * d.msec),
044
045        /**
046         * Year (alternative for convenience).
047         */
048        y("Year", 365L * d.msec)
049        ;
050
051        private final String displayName;
052        private final long msec;
053
054        private TimeUnit(String displayName, long msec)
055        {
056                this.displayName = displayName;
057                this.msec = msec;
058        }
059
060        public long toMillis(long value)
061        {
062                return value * msec;
063        }
064
065        public long toMillis()
066        {
067                return msec;
068        }
069
070        public String getDisplayName() {
071                return displayName;
072        }
073
074        public static String getAllUnitsWithDisplayName()
075        {
076                return getAllUnitsWithDisplayName(", ");
077        }
078
079        public static String getAllUnitsWithDisplayName(String separator)
080        {
081                return getAllUnitsWithDisplayName("%s (%s)", separator);
082        }
083
084        public static String getAllUnitsWithDisplayName(String unitFormat, String separator)
085        {
086                StringBuilder sb = new StringBuilder();
087
088                for (TimeUnit u : values()) {
089                        if (sb.length() > 0)
090                                sb.append(separator);
091
092                        sb.append(String.format(unitFormat, u.name(), u.getDisplayName()));
093                }
094
095                return sb.toString();
096        }
097
098        public static List<TimeUnit> getUniqueTimeUnitsOrderedByLengthAsc() {
099                final List<TimeUnit> result = new ArrayList<>(Arrays.asList(TimeUnit.values()));
100                result.remove(TimeUnit.y); // "y" is redundant - using only "a" by default.
101                return Collections.unmodifiableList(result);
102        }
103
104        public static List<TimeUnit> getUniqueTimeUnitsOrderedByLengthDesc() {
105                final List<TimeUnit> asc = getUniqueTimeUnitsOrderedByLengthAsc();
106                final List<TimeUnit> desc = new ArrayList<TimeUnit>(asc.size());
107                for (final ListIterator<TimeUnit> it = asc.listIterator(asc.size()); it.hasPrevious();) {
108                        final TimeUnit timeUnit = it.previous();
109                        desc.add(timeUnit);
110                }
111                return desc;
112        }
113}