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