001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * --------------
028     * DateRange.java
029     * --------------
030     * (C) Copyright 2002-2005, by Object Refinery Limited and Contributors.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   Bill Kelemen;
034     *
035     * $Id: DateRange.java,v 1.5.2.1 2005/10/25 21:35:24 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 22-Apr-2002 : Version 1 based on code by Bill Kelemen (DG);
040     * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
041     * 23-Sep-2003 : Minor Javadoc update (DG);
042     *
043     */
044    
045    package org.jfree.data.time;
046    
047    import java.io.Serializable;
048    import java.text.DateFormat;
049    import java.util.Date;
050    
051    import org.jfree.data.Range;
052    
053    /**
054     * A range specified in terms of two <code>java.util.Date</code> objects.  
055     * Instances of this class are immutable.
056     */
057    public class DateRange extends Range implements Serializable {
058    
059        /** For serialization. */
060        private static final long serialVersionUID = -4705682568375418157L;
061        
062        /** The lower bound for the range. */
063        private Date lowerDate;
064    
065        /** The upper bound for the range. */
066        private Date upperDate;
067    
068        /**
069         * Default constructor.
070         */
071        public DateRange() {
072            this(new Date(0), new Date(1));
073        }
074    
075        /**
076         * Constructs a new range.
077         *
078         * @param lower  the lower bound (<code>null</code> not permitted).
079         * @param upper  the upper bound (<code>null</code> not permitted).
080         */
081        public DateRange(Date lower, Date upper) {
082    
083            super(lower.getTime(), upper.getTime());
084            this.lowerDate = lower;
085            this.upperDate = upper;
086    
087        }
088    
089        /**
090         * Constructs a new range using two values that will be interpreted as 
091         * "milliseconds since midnight GMT, 1-Jan-1970".
092         *
093         * @param lower  the lower (oldest) date.
094         * @param upper  the upper (most recent) date.
095         */
096        public DateRange(double lower, double upper) {
097            super(lower, upper);
098            this.lowerDate = new Date((long) lower);
099            this.upperDate = new Date((long) upper);
100        }
101    
102        /**
103         * Constructs a new range that is based on another {@link Range}.  The 
104         * other range does not have to be a {@link DateRange}.  If it is not, the 
105         * upper and lower bounds are evaluated as milliseconds since midnight 
106         * GMT, 1-Jan-1970.
107         *
108         * @param other  the other range (<code>null</code> not permitted).
109         */
110        public DateRange(Range other) {
111            this(other.getLowerBound(), other.getUpperBound());
112        }
113    
114        /**
115         * Returns the lower (earlier) date for the range.
116         *
117         * @return The lower date for the range.
118         */
119        public Date getLowerDate() {
120            return this.lowerDate;
121        }
122    
123        /**
124         * Returns the upper (later) date for the range.
125         *
126         * @return The upper date for the range.
127         */
128        public Date getUpperDate() {
129            return this.upperDate;
130        }
131        
132        /**
133         * Returns a string representing the date range (useful for debugging).
134         * 
135         * @return A string representing the date range.
136         */
137        public String toString() {
138            DateFormat df = DateFormat.getDateTimeInstance();
139            return "[" + df.format(this.lowerDate) + " --> " 
140                + df.format(this.upperDate) + "]";
141        }
142    
143    }