001 package jp.osdl.jbento2.analyzer;
002
003 import java.io.Serializable;
004 import java.util.regex.Matcher;
005 import java.util.regex.Pattern;
006
007 /**
008 * Time class represents the time used in JBento.
009 * The value must be formatted as "MILLISECOND" or "MILLISECOND[NANOSECOND]"
010 */
011 public class Time implements Serializable, Comparable {
012
013 public static final Time ZERO = new Time(0);
014
015 private static final Pattern REGEXP =
016 Pattern.compile("^([0-9]+)(?:\\[([0-9]+)\\])?$");
017
018 private String value;
019
020 /**
021 * Construct Time instance.
022 *
023 * @param value value
024 * @throws IllegalArgumentException thrown if value has invalid fomat.
025 */
026 public Time(String value) {
027 if (!REGEXP.matcher(value).matches()) {
028 throw new IllegalArgumentException(
029 "Invalid format. value=" + value);
030 }
031 this.value = value;
032 }
033
034 /**
035 * Construct Time instance.
036 *
037 * @param millitime millitime
038 */
039 public Time(long millitime) {
040 this.value = String.valueOf(millitime);
041 }
042
043 /**
044 * Returns milliseconds.
045 *
046 * @return milliseconds value.
047 */
048 public long getMillitime() {
049 Matcher m = REGEXP.matcher(value);
050 m.matches();
051 String milli = m.group(1);
052 return Long.parseLong(milli);
053 }
054
055 /**
056 * Returns nanoseconds value.
057 *
058 * @return nanoseconds value.
059 * @throws IllegalStateException
060 * thrown if this instance doesn't have nanoseconds.
061 */
062 public long getNanotime() {
063 Matcher m = REGEXP.matcher(value);
064 m.matches();
065 String nano = m.group(2);
066 if (nano == null) {
067 throw new IllegalStateException(
068 "This instance doesn't have nanoseconds.");
069 }
070 return Long.parseLong(nano);
071 }
072
073 /**
074 * Returns nanoseconds value.
075 *
076 * @return nanoseconds value.
077 */
078 public boolean hasNanotime() {
079 Matcher m = REGEXP.matcher(value);
080 m.matches();
081 return m.group(2) != null;
082 }
083
084 public String toString() {
085 return value;
086 }
087
088 public int compareTo(Object o) {
089 return this.value.compareTo(((Time)o).value);
090 }
091
092 }
093