package org.ovirt.engine.core.compat; import java.io.Serializable; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; public class TimeSpan implements Comparable<TimeSpan>, Serializable { public static int MS_PER_SECOND = 1000 ; public static int MS_PER_MINUTE = 60 * 1000 ; public static int MS_PER_HOUR = 60 * 60 * 1000 ; public static int MS_PER_DAY = 24 * 60 * 60 * 1000 ; public int Days; public int Hours; public int Minutes; public int Seconds; public int Milliseconds ; public double TotalDays ; public double TotalHours ; public double TotalMinutes ; public double TotalSeconds; public long TotalMilliseconds; public TimeSpan() { } public TimeSpan(long milliseconds) { TotalMilliseconds = milliseconds ; computeProperties() ; } public TimeSpan(int hours, int minutes, int seconds) { this(0,hours,minutes,seconds,0) ; } public TimeSpan(int days, int hours, int minutes, int seconds) { this(days,hours,minutes,seconds,0) ; } public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds) { TotalMilliseconds = milliseconds ; TotalMilliseconds += seconds * MS_PER_SECOND ; TotalMilliseconds += minutes * MS_PER_MINUTE ; TotalMilliseconds += hours * MS_PER_HOUR ; TotalMilliseconds += days * MS_PER_DAY ; computeProperties() ; } public TimeSpan(int[] data) { this(data[0], data[1], data[2], data[3], data[4]) ; } protected void computeProperties() { long remainder = TotalMilliseconds ; // Days Days = (int) (remainder / MS_PER_DAY) ; remainder = remainder % MS_PER_DAY ; // Hours Hours = (int) (remainder / MS_PER_HOUR) ; remainder = remainder % MS_PER_HOUR ; remainder = remainder % MS_PER_DAY ; // Minutes Minutes = (int) (remainder / MS_PER_MINUTE) ; remainder = remainder % MS_PER_MINUTE ; // Minutes Seconds = (int) (remainder / MS_PER_SECOND) ; remainder = remainder % MS_PER_SECOND ; Milliseconds = (int) remainder ; } // The format for a timespan is: // [ws][-]{ d | d.hh:mm[:ss[.ff]] | hh:mm[:ss[.ff]] }[ws] public static TimeSpan Parse(String argvalue) { String cleaned = argvalue.trim() ; int multiplier = 1 ; if (cleaned.contains("-")) { multiplier = -1 ; cleaned = cleaned.replace("-", "").trim() ; } RegExp r = RegExp.compile("^[0-9]+$"); if (r.test(cleaned)) { int days = Integer.parseInt(cleaned) ; return new TimeSpan(days * multiplier, 0, 0, 0) ; } String regex = "^[0-9]+.[0-9]{2}:[0-9]{2}(:[0-9]{2}(.[0-9]{2})?)?$" ; r = RegExp.compile(regex); if (r.test(cleaned)) { String[] items = cleaned.split("[:.]") ; int[] data = new int[5] ; for (int x = 0 ; x < items.length ; x++) { data[x] = Integer.parseInt(items[x]) * multiplier ; } return new TimeSpan(data) ; } regex = "^[0-9]{2}:[0-9]{2}(:[0-9]{2}(.[0-9]{2})?)?$" ; r = RegExp.compile(regex); if (r.test(cleaned)) { String[] items = cleaned.split("[:.]") ; int[] data = new int[5] ; for (int x = 0 ; x < items.length ; x++) { data[x+1] = Integer.parseInt(items[x]) * multiplier ; } return new TimeSpan(data) ; } // If we get to here, it is invalid throw new CompatException("Invalid TimeSpan") ; } public String toString() { String prefix = "" ; if (TotalMilliseconds < 0) { prefix = "-" ; } //GWT-TODO return String.format("%s%d.%02d:%02d:%02d.%03d", prefix, Days, Hours, Minutes, Seconds, Milliseconds) ; return null; } public static boolean TryParse(String string, RefObject<TimeSpan> ref) { boolean returnValue = false ; try { TimeSpan result = TimeSpan.Parse(string) ; returnValue = true ; ref.argvalue = result ; } catch (CompatException e) { //eat it, return false } return returnValue ; } @Override public int compareTo(TimeSpan o) { int result; if (TotalMilliseconds < o.TotalMilliseconds) { result = -1; } else if (TotalMilliseconds > o.TotalMilliseconds) { result = 1; } else { result = 0; } return result; } }