    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2008, 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     * FixedMillisecond.java
    029     * ---------------------
    030     * (C) Copyright 2002-2008, by Object Refinery Limited.
    031     *
    032     * Original Author:  David Gilbert (for Object Refinery Limited);
    033     * Contributor(s):   -;
    034     *
    035     * Changes
    036     * -------
    037     * 19-Mar-2002 : Version 1, based on original Millisecond implementation (DG);
    038     * 24-Jun-2002 : Removed unnecessary imports (DG);
    039     * 10-Sep-2002 : Added getSerialIndex() method (DG);
    040     * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
    041     * 13-Mar-2003 : Moved to com.jrefinery.data.time package and implemented
    042     *               Serializable (DG);
    043     * 21-Oct-2003 : Added hashCode() method (DG);
    044     * ------------- JFREECHART 1.0.x ---------------------------------------------
    045     * 06-Oct-2006 : Added peg() method (DG);
    046     * 28-May-2008 : Fixed immutability problem (DG);
    047     *
    048     */
    049
    050    package org.jfree.data.time;
    051
    052    import java.io.Serializable;
    053    import java.util.Calendar;
    054    import java.util.Date;
    055
    056    /**
    057     * Wrapper for a <code>java.util.Date</code> object that allows it to be used
    058     * as a {@link RegularTimePeriod}.  This class is immutable, which is a
    059     * requirement for all {@link RegularTimePeriod} subclasses.
    060     */
    061    public class FixedMillisecond extends RegularTimePeriod
    062            implements Serializable {
    063
    064        /** For serialization. */
    065        private static final long serialVersionUID = 7867521484545646931L;
    066
    067        /** The millisecond. */
    068        private long time;
    069
    070        /**
    071         * Constructs a millisecond based on the current system time.
    072         */
    073        public FixedMillisecond() {
    074            this(new Date());
    075        }
    076
    077        /**
    078         * Constructs a millisecond.
    079         *
    080         * @param millisecond  the millisecond (same encoding as java.util.Date).
    081         */
    082        public FixedMillisecond(long millisecond) {
    083            this(new Date(millisecond));
    084        }
    085
    086        /**
    087         * Constructs a millisecond.
    088         *
    089         * @param time  the time.
    090         */
    091        public FixedMillisecond(Date time) {
    092            this.time = time.getTime();
    093        }
    094
    095        /**
    096         * Returns the date/time.
    097         *
    098         * @return The date/time.
    099         */
    100        public Date getTime() {
    101            return new Date(this.time);
    102        }
    103
    104        /**
    105         * This method is overridden to do nothing.
    106         *
    107         * @param calendar  ignored
    108         *
    109         * @since 1.0.3
    110         */
    111        public void peg(Calendar calendar) {
    112            // nothing to do
    113        }
    114
    115        /**
    116         * Returns the millisecond preceding this one.
    117         *
    118         * @return The millisecond preceding this one.
    119         */
    120        public RegularTimePeriod previous() {
    121            RegularTimePeriod result = null;
    122            long t = this.time;
    123            if (t != Long.MIN_VALUE) {
    124                result = new FixedMillisecond(t - 1);
    125            }
    126            return result;
    127        }
    128
    129        /**
    130         * Returns the millisecond following this one.
    131         *
    132         * @return The millisecond following this one.
    133         */
    134        public RegularTimePeriod next() {
    135            RegularTimePeriod result = null;
    136            long t = this.time;
    137            if (t != Long.MAX_VALUE) {
    138                result = new FixedMillisecond(t + 1);
    139            }
    140            return result;
    141        }
    142
    143        /**
    144         * Tests the equality of this object against an arbitrary Object.
    145         *
    146         * @param object  the object to compare
    147         *
    148         * @return A boolean.
    149         */
    150        public boolean equals(Object object) {
    151            if (object instanceof FixedMillisecond) {
    152                FixedMillisecond m = (FixedMillisecond) object;
    153                return this.time == m.getFirstMillisecond();
    154            }
    155            else {
    156                return false;
    157            }
    158
    159        }
    160
    161        /**
    162         * Returns a hash code for this object instance.
    163         *
    164         * @return A hash code.
    165         */
    166        public int hashCode() {
    167            return (int) this.time;
    168        }
    169
    170        /**
    171         * Returns an integer indicating the order of this Millisecond object
    172         * relative to the specified
    173         * object: negative == before, zero == same, positive == after.
    174         *
    175         * @param o1    the object to compare.
    176         *
    177         * @return negative == before, zero == same, positive == after.
    178         */
    179        public int compareTo(Object o1) {
    180
    181            int result;
    182            long difference;
    183
    184            // CASE 1 : Comparing to another Second object
    185            // -------------------------------------------
    186            if (o1 instanceof FixedMillisecond) {
    187                FixedMillisecond t1 = (FixedMillisecond) o1;
    188                difference = this.time - t1.time;
    189                if (difference > 0) {
    190                    result = 1;
    191                }
    192                else {
    193                    if (difference < 0) {
    194                       result = -1;
    195                    }
    196                    else {
    197                        result = 0;
    198                    }
    199                }
    200            }
    201
    202            // CASE 2 : Comparing to another TimePeriod object
    203            // -----------------------------------------------
    204            else if (o1 instanceof RegularTimePeriod) {
    205                // more difficult case - evaluate later...
    206                result = 0;
    207            }
    208
    209            // CASE 3 : Comparing to a non-TimePeriod object
    210            // ---------------------------------------------
    211            else {
    212                // consider time periods to be ordered after general objects
    213                result = 1;
    214            }
    215
    216            return result;
    217
    218        }
    219
    220        /**
    221         * Returns the first millisecond of the time period.
    222         *
    223         * @return The first millisecond of the time period.
    224         */
    225        public long getFirstMillisecond() {
    226            return this.time;
    227        }
    228
    229
    230        /**
    231         * Returns the first millisecond of the time period.
    232         *
    233         * @param calendar  the calendar.
    234         *
    235         * @return The first millisecond of the time period.
    236         */
    237        public long getFirstMillisecond(Calendar calendar) {
    238            return this.time;
    239        }
    240
    241        /**
    242         * Returns the last millisecond of the time period.
    243         *
    244         * @return The last millisecond of the time period.
    245         */
    246        public long getLastMillisecond() {
    247            return this.time;
    248        }
    249
    250        /**
    251         * Returns the last millisecond of the time period.
    252         *
    253         * @param calendar  the calendar.
    254         *
    255         * @return The last millisecond of the time period.
    256         */
    257        public long getLastMillisecond(Calendar calendar) {
    258            return this.time;
    259        }
    260
    261        /**
    262         * Returns the millisecond closest to the middle of the time period.
    263         *
    264         * @return The millisecond closest to the middle of the time period.
    265         */
    266        public long getMiddleMillisecond() {
    267            return this.time;
    268        }
    269
    270        /**
    271         * Returns the millisecond closest to the middle of the time period.
    272         *
    273         * @param calendar  the calendar.
    274         *
    275         * @return The millisecond closest to the middle of the time period.
    276         */
    277        public long getMiddleMillisecond(Calendar calendar) {
    278            return this.time;
    279        }
    280
    281        /**
    282         * Returns a serial index number for the millisecond.
    283         *
    284         * @return The serial index number.
    285         */
    286        public long getSerialIndex() {
    287            return this.time;
    288        }
    289
    290    }