001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.text;
017    
018    /**
019     * A text formatter that formats time periods (durations.)
020     * 
021     * @author Keith Donald
022     */
023    public abstract class TimeFormat {
024        private static final TimeFormat daysInstance = new TimeFormat() {
025            public String format(long time) {
026                int totalSeconds = (int)time / 1000;
027                int days = totalSeconds / 86400;
028                int dSecs = days * 86400;
029    
030                int hours = (totalSeconds - dSecs) / 3600;
031                int hSecs = hours * 3600;
032    
033                int minutes = (totalSeconds - dSecs - hSecs) / 60;
034                int mSecs = minutes * 60;
035    
036                int seconds = totalSeconds - dSecs - hSecs - mSecs;
037    
038                StringBuffer buf = new StringBuffer();
039                if (days > 0) {
040                    buf.append(days);
041                    buf.append("d ");
042                }
043                buf.append(hours);
044                buf.append("h ");
045                buf.append(minutes);
046                buf.append("m ");
047                buf.append(seconds);
048                buf.append("s");
049                return buf.toString();
050            }
051        };
052    
053        private static final TimeFormat millisecondsInstance = new TimeFormat() {
054            public String format(long time) {
055                int totalSeconds = (int)time / 1000;
056                int days = totalSeconds / 86400;
057                int dSecs = days * 86400;
058    
059                int hours = (totalSeconds - dSecs) / 3600;
060                int hSecs = hours * 3600;
061    
062                int minutes = (totalSeconds - dSecs - hSecs) / 60;
063                int mSecs = minutes * 60;
064    
065                int seconds = totalSeconds - dSecs - hSecs - mSecs;
066    
067                long milliseconds = time - dSecs * 1000 - hSecs * 1000 - mSecs * 1000 - seconds * 1000;
068    
069                StringBuffer buf = new StringBuffer();
070                if (days > 0) {
071                    buf.append(days);
072                    buf.append("d ");
073                }
074                if (hours > 0) {
075                    buf.append(hours);
076                    buf.append("h ");
077                }
078                if (minutes > 0) {
079                    buf.append(minutes);
080                    buf.append("m ");
081                }
082                if (seconds > 0) {
083                    buf.append(seconds);
084                    buf.append("s ");
085                }
086                if (milliseconds > 0) {
087                    buf.append(milliseconds);
088                    buf.append("ms");
089                }
090                if (buf.length() == 0)
091                    return "0";
092    
093                return buf.toString();
094            }
095        };
096    
097        /**
098         * Returns a standard TimeFormat that formats using days, hours, minutes,
099         * and seconds.
100         * <p>
101         * The format looks like: 5d 23h 12m 52s.
102         * 
103         * @return The daysInstance TimeFormatter.
104         */
105        public static synchronized TimeFormat getDaysInstance() {
106            return daysInstance;
107        }
108    
109        /**
110         * Returns a TimeFormat that formats using days, hours, minutes, seconds,
111         * and milliseconds.
112         * <p>
113         * The format looks like: 5d 23h 12m 52s 10ms.
114         * 
115         * @return The millisecondsInstance TimeFormatter.
116         */
117        public static synchronized TimeFormat getMillisecondsInstance() {
118            return millisecondsInstance;
119        }
120    
121        /**
122         * Returns a formatted time string for the specified time period.
123         * 
124         * @param time
125         *            the time period.
126         * @return The formatted time string.
127         */
128        public abstract String format(long time);
129    
130    }