Frames | No Frames |
1: /* Duration.java -- 2: Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: package javax.xml.datatype; 39: 40: import java.math.BigDecimal; 41: import java.util.Calendar; 42: import java.util.Date; 43: import java.util.GregorianCalendar; 44: import javax.xml.datatype.DatatypeConstants; 45: import javax.xml.namespace.QName; 46: 47: /** 48: * An immutable time space as specified in XML Schema 1.0. 49: * 50: * @author (a href='mailto:dog@gnu.org'>Chris Burdess</a) 51: * @since 1.5 52: */ 53: public abstract class Duration 54: { 55: 56: /** 57: * Returns the name of the XML Schema data type this value maps to. 58: */ 59: public QName getXMLSchemaType() 60: { 61: int state = 0; 62: state |= isSet(DatatypeConstants.YEARS) ? 32 : 0; 63: state |= isSet(DatatypeConstants.MONTHS) ? 16 : 0; 64: state |= isSet(DatatypeConstants.DAYS) ? 8 : 0; 65: state |= isSet(DatatypeConstants.HOURS) ? 4 : 0; 66: state |= isSet(DatatypeConstants.MINUTES) ? 2 : 0; 67: state |= isSet(DatatypeConstants.SECONDS) ? 1 : 0; 68: switch (state) 69: { 70: case 63: 71: return DatatypeConstants.DURATION; 72: case 15: 73: return DatatypeConstants.DURATION_DAYTIME; 74: case 48: 75: return DatatypeConstants.DURATION_YEARMONTH; 76: default: 77: throw new IllegalStateException(); 78: } 79: } 80: 81: /** 82: * Returns the sign of this value. 83: */ 84: public abstract int getSign(); 85: 86: /** 87: * Returns the years in this duration as an int, or 0 if not present. 88: */ 89: public int getYears() 90: { 91: Number val = getField(DatatypeConstants.YEARS); 92: return (val == null) ? 0 : val.intValue(); 93: } 94: 95: /** 96: * Returns the months in this duration as an int, or 0 if not present. 97: */ 98: public int getMonths() 99: { 100: Number val = getField(DatatypeConstants.MONTHS); 101: return (val == null) ? 0 : val.intValue(); 102: } 103: 104: /** 105: * Returns the days in this duration as an int, or 0 if not present. 106: */ 107: public int getDays() 108: { 109: Number val = getField(DatatypeConstants.DAYS); 110: return (val == null) ? 0 : val.intValue(); 111: } 112: 113: /** 114: * Returns the hours in this duration as an int, or 0 if not present. 115: */ 116: public int getHours() 117: { 118: Number val = getField(DatatypeConstants.HOURS); 119: return (val == null) ? 0 : val.intValue(); 120: } 121: 122: /** 123: * Returns the minutes in this duration as an int, or 0 if not present. 124: */ 125: public int getMinutes() 126: { 127: Number val = getField(DatatypeConstants.MINUTES); 128: return (val == null) ? 0 : val.intValue(); 129: } 130: 131: /** 132: * Returns the seconds in this duration as an int, or 0 if not present. 133: */ 134: public int getSeconds() 135: { 136: Number val = getField(DatatypeConstants.SECONDS); 137: return (val == null) ? 0 : val.intValue(); 138: } 139: 140: /** 141: * Returns the duration length in milliseconds. 142: * Because the length of a month or year may vary depending on the year, 143: * the <code>startInstant</code> parameter is used to specify the duration 144: * offset. 145: */ 146: public long getTimeInMillis(Calendar startInstant) 147: { 148: Calendar cal = (Calendar) startInstant.clone(); 149: long t1 = cal.getTimeInMillis(); 150: addTo(cal); 151: long t2 = cal.getTimeInMillis(); 152: return t2 - t1; 153: } 154: 155: /** 156: * Returns the duration length in milliseconds. 157: * Because the length of a month or year may vary depending on the year, 158: * the <code>startInstant</code> parameter is used to specify the duration 159: * offset. 160: */ 161: public long getTimeInMillis(Date startInstant) 162: { 163: Date date = (Date) startInstant.clone(); 164: long t1 = date.getTime(); 165: addTo(date); 166: long t2 = date.getTime(); 167: return t2 - t1; 168: } 169: 170: /** 171: * Returns the value of the specified field, or <code>null</code> if the 172: * field is undefined. 173: */ 174: public abstract Number getField(DatatypeConstants.Field field); 175: 176: /** 177: * Indicates whether the specified field is set. 178: */ 179: public abstract boolean isSet(DatatypeConstants.Field field); 180: 181: /** 182: * Returns the result of adding the specified duration to this duration. 183: */ 184: public abstract Duration add(Duration rhs); 185: 186: /** 187: * Adds this duration to the specified calendar. 188: */ 189: public abstract void addTo(Calendar calendar); 190: /*{ 191: switch (getSign()) 192: { 193: case -1: 194: calendar.add(Calendar.YEAR, -getYears()); 195: calendar.add(Calendar.MONTH, -getMonths()); 196: calendar.add(Calendar.DATE, -getDays()); 197: calendar.add(Calendar.HOUR, -getHours()); 198: calendar.add(Calendar.MINUTE, -getMinutes()); 199: calendar.add(Calendar.SECOND, -getSeconds()); 200: break; 201: case 1: 202: calendar.add(Calendar.YEAR, getYears()); 203: calendar.add(Calendar.MONTH, getMonths()); 204: calendar.add(Calendar.DATE, getDays()); 205: calendar.add(Calendar.HOUR, getHours()); 206: calendar.add(Calendar.MINUTE, getMinutes()); 207: calendar.add(Calendar.SECOND, getSeconds()); 208: } 209: }*/ 210: 211: /** 212: * Adds this duration to the specified date. 213: */ 214: public void addTo(Date date) 215: { 216: Calendar calendar = new GregorianCalendar(); 217: calendar.setTimeInMillis(date.getTime()); 218: addTo(calendar); 219: date.setTime(calendar.getTimeInMillis()); 220: } 221: 222: /** 223: * Returns the result of subtracting the given duration from this 224: * duration. 225: */ 226: public Duration subtract(Duration rhs) 227: { 228: // TODO 229: throw new UnsupportedOperationException(); 230: } 231: 232: /** 233: * Returns the result of multiplying this duration by the given factor. 234: */ 235: public Duration multiply(int factor) 236: { 237: return multiply(BigDecimal.valueOf((long) factor)); 238: } 239: 240: /** 241: * Returns the result of multiplying this duration by the given factor. 242: */ 243: public abstract Duration multiply(BigDecimal factor); 244: 245: /** 246: * Returns the unary negative of this duration. 247: */ 248: public abstract Duration negate(); 249: 250: /** 251: * Converts the years and months fields into the days field using a 252: * specific time instant as the reference point. 253: */ 254: public abstract Duration normalizeWith(Calendar startTimeInstant); 255: 256: /** 257: * Partial order relation comparison with this duration, in accordance 258: * with XML Schema 1.0 Part 2, Section 3.2.7.6.2. 259: */ 260: public abstract int compare(Duration duration); 261: 262: public boolean isLongerThan(Duration duration) 263: { 264: // TODO 265: throw new UnsupportedOperationException(); 266: } 267: 268: public boolean isShorterThan(Duration duration) 269: { 270: // TODO 271: throw new UnsupportedOperationException(); 272: } 273: 274: public boolean equals(java.lang.Object duration) 275: { 276: // TODO 277: throw new UnsupportedOperationException(); 278: } 279: 280: public abstract int hashCode(); 281: 282: /** 283: * Returns the lexical representation of this duration. 284: */ 285: public String toString() 286: { 287: // TODO 288: throw new UnsupportedOperationException(); 289: } 290: 291: }