| /* Duration.java -- |
| Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| package javax.xml.datatype; |
| |
| import java.math.BigDecimal; |
| import java.util.Calendar; |
| import java.util.Date; |
| import java.util.GregorianCalendar; |
| import javax.xml.datatype.DatatypeConstants; |
| import javax.xml.namespace.QName; |
| |
| /** |
| * An immutable time space as specified in XML Schema 1.0. |
| * |
| * @author (a href='mailto:dog@gnu.org'>Chris Burdess</a) |
| * @since 1.5 |
| */ |
| public abstract class Duration |
| { |
| |
| /** |
| * Returns the name of the XML Schema data type this value maps to. |
| */ |
| public QName getXMLSchemaType() |
| { |
| int state = 0; |
| state |= isSet(DatatypeConstants.YEARS) ? 32 : 0; |
| state |= isSet(DatatypeConstants.MONTHS) ? 16 : 0; |
| state |= isSet(DatatypeConstants.DAYS) ? 8 : 0; |
| state |= isSet(DatatypeConstants.HOURS) ? 4 : 0; |
| state |= isSet(DatatypeConstants.MINUTES) ? 2 : 0; |
| state |= isSet(DatatypeConstants.SECONDS) ? 1 : 0; |
| switch (state) |
| { |
| case 63: |
| return DatatypeConstants.DURATION; |
| case 15: |
| return DatatypeConstants.DURATION_DAYTIME; |
| case 48: |
| return DatatypeConstants.DURATION_YEARMONTH; |
| default: |
| throw new IllegalStateException(); |
| } |
| } |
| |
| /** |
| * Returns the sign of this value. |
| */ |
| public abstract int getSign(); |
| |
| /** |
| * Returns the years in this duration as an int, or 0 if not present. |
| */ |
| public int getYears() |
| { |
| Number val = getField(DatatypeConstants.YEARS); |
| return (val == null) ? 0 : val.intValue(); |
| } |
| |
| /** |
| * Returns the months in this duration as an int, or 0 if not present. |
| */ |
| public int getMonths() |
| { |
| Number val = getField(DatatypeConstants.MONTHS); |
| return (val == null) ? 0 : val.intValue(); |
| } |
| |
| /** |
| * Returns the days in this duration as an int, or 0 if not present. |
| */ |
| public int getDays() |
| { |
| Number val = getField(DatatypeConstants.DAYS); |
| return (val == null) ? 0 : val.intValue(); |
| } |
| |
| /** |
| * Returns the hours in this duration as an int, or 0 if not present. |
| */ |
| public int getHours() |
| { |
| Number val = getField(DatatypeConstants.HOURS); |
| return (val == null) ? 0 : val.intValue(); |
| } |
| |
| /** |
| * Returns the minutes in this duration as an int, or 0 if not present. |
| */ |
| public int getMinutes() |
| { |
| Number val = getField(DatatypeConstants.MINUTES); |
| return (val == null) ? 0 : val.intValue(); |
| } |
| |
| /** |
| * Returns the seconds in this duration as an int, or 0 if not present. |
| */ |
| public int getSeconds() |
| { |
| Number val = getField(DatatypeConstants.SECONDS); |
| return (val == null) ? 0 : val.intValue(); |
| } |
| |
| /** |
| * Returns the duration length in milliseconds. |
| * Because the length of a month or year may vary depending on the year, |
| * the <code>startInstant</code> parameter is used to specify the duration |
| * offset. |
| */ |
| public long getTimeInMillis(Calendar startInstant) |
| { |
| Calendar cal = (Calendar) startInstant.clone(); |
| long t1 = cal.getTimeInMillis(); |
| addTo(cal); |
| long t2 = cal.getTimeInMillis(); |
| return t2 - t1; |
| } |
| |
| /** |
| * Returns the duration length in milliseconds. |
| * Because the length of a month or year may vary depending on the year, |
| * the <code>startInstant</code> parameter is used to specify the duration |
| * offset. |
| */ |
| public long getTimeInMillis(Date startInstant) |
| { |
| Date date = (Date) startInstant.clone(); |
| long t1 = date.getTime(); |
| addTo(date); |
| long t2 = date.getTime(); |
| return t2 - t1; |
| } |
| |
| /** |
| * Returns the value of the specified field, or <code>null</code> if the |
| * field is undefined. |
| */ |
| public abstract Number getField(DatatypeConstants.Field field); |
| |
| /** |
| * Indicates whether the specified field is set. |
| */ |
| public abstract boolean isSet(DatatypeConstants.Field field); |
| |
| /** |
| * Returns the result of adding the specified duration to this duration. |
| */ |
| public abstract Duration add(Duration rhs); |
| |
| /** |
| * Adds this duration to the specified calendar. |
| */ |
| public abstract void addTo(Calendar calendar); |
| /*{ |
| switch (getSign()) |
| { |
| case -1: |
| calendar.add(Calendar.YEAR, -getYears()); |
| calendar.add(Calendar.MONTH, -getMonths()); |
| calendar.add(Calendar.DATE, -getDays()); |
| calendar.add(Calendar.HOUR, -getHours()); |
| calendar.add(Calendar.MINUTE, -getMinutes()); |
| calendar.add(Calendar.SECOND, -getSeconds()); |
| break; |
| case 1: |
| calendar.add(Calendar.YEAR, getYears()); |
| calendar.add(Calendar.MONTH, getMonths()); |
| calendar.add(Calendar.DATE, getDays()); |
| calendar.add(Calendar.HOUR, getHours()); |
| calendar.add(Calendar.MINUTE, getMinutes()); |
| calendar.add(Calendar.SECOND, getSeconds()); |
| } |
| }*/ |
| |
| /** |
| * Adds this duration to the specified date. |
| */ |
| public void addTo(Date date) |
| { |
| Calendar calendar = new GregorianCalendar(); |
| calendar.setTimeInMillis(date.getTime()); |
| addTo(calendar); |
| date.setTime(calendar.getTimeInMillis()); |
| } |
| |
| /** |
| * Returns the result of subtracting the given duration from this |
| * duration. |
| */ |
| public Duration subtract(Duration rhs) |
| { |
| // TODO |
| throw new UnsupportedOperationException(); |
| } |
| |
| /** |
| * Returns the result of multiplying this duration by the given factor. |
| */ |
| public Duration multiply(int factor) |
| { |
| return multiply(BigDecimal.valueOf((long) factor)); |
| } |
| |
| /** |
| * Returns the result of multiplying this duration by the given factor. |
| */ |
| public abstract Duration multiply(BigDecimal factor); |
| |
| /** |
| * Returns the unary negative of this duration. |
| */ |
| public abstract Duration negate(); |
| |
| /** |
| * Converts the years and months fields into the days field using a |
| * specific time instant as the reference point. |
| */ |
| public abstract Duration normalizeWith(Calendar startTimeInstant); |
| |
| /** |
| * Partial order relation comparison with this duration, in accordance |
| * with XML Schema 1.0 Part 2, Section 3.2.7.6.2. |
| */ |
| public abstract int compare(Duration duration); |
| |
| public boolean isLongerThan(Duration duration) |
| { |
| // TODO |
| throw new UnsupportedOperationException(); |
| } |
| |
| public boolean isShorterThan(Duration duration) |
| { |
| // TODO |
| throw new UnsupportedOperationException(); |
| } |
| |
| public boolean equals(java.lang.Object duration) |
| { |
| // TODO |
| throw new UnsupportedOperationException(); |
| } |
| |
| public abstract int hashCode(); |
| |
| /** |
| * Returns the lexical representation of this duration. |
| */ |
| public String toString() |
| { |
| // TODO |
| throw new UnsupportedOperationException(); |
| } |
| |
| } |