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 * DefaultOHLCDataset.java
029 * -----------------------
030 * (C) Copyright 2003-2008, by Object Refinery Limited.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * Changes
036 * -------
037 * 03-Dec-2003 : Version 1 (DG);
038 * 05-May-2004 : Now extends AbstractXYDataset (DG);
039 * 15-Jul-2004 : Switched getX() with getXValue() and getY() with
040 * getYValue() (DG);
041 * 29-Apr-2005 : Added equals() method (DG);
042 * 22-Apr-2008 : Implemented PublicCloneable, and fixed cloning bug (DG);
043 *
044 */
045
046 package org.jfree.data.xy;
047
048 import java.util.Arrays;
049 import java.util.Date;
050
051 import org.jfree.util.PublicCloneable;
052
053 /**
054 * A simple implementation of the {@link OHLCDataset} interface. This
055 * implementation supports only one series.
056 */
057 public class DefaultOHLCDataset extends AbstractXYDataset
058 implements OHLCDataset, PublicCloneable {
059
060 /** The series key. */
061 private Comparable key;
062
063 /** Storage for the data items. */
064 private OHLCDataItem[] data;
065
066 /**
067 * Creates a new dataset.
068 *
069 * @param key the series key.
070 * @param data the data items.
071 */
072 public DefaultOHLCDataset(Comparable key, OHLCDataItem[] data) {
073 this.key = key;
074 this.data = data;
075 }
076
077 /**
078 * Returns the series key.
079 *
080 * @param series the series index (ignored).
081 *
082 * @return The series key.
083 */
084 public Comparable getSeriesKey(int series) {
085 return this.key;
086 }
087
088 /**
089 * Returns the x-value for a data item.
090 *
091 * @param series the series index (ignored).
092 * @param item the item index (zero-based).
093 *
094 * @return The x-value.
095 */
096 public Number getX(int series, int item) {
097 return new Long(this.data[item].getDate().getTime());
098 }
099
100 /**
101 * Returns the x-value for a data item as a date.
102 *
103 * @param series the series index (ignored).
104 * @param item the item index (zero-based).
105 *
106 * @return The x-value as a date.
107 */
108 public Date getXDate(int series, int item) {
109 return this.data[item].getDate();
110 }
111
112 /**
113 * Returns the y-value.
114 *
115 * @param series the series index (ignored).
116 * @param item the item index (zero-based).
117 *
118 * @return The y value.
119 */
120 public Number getY(int series, int item) {
121 return getClose(series, item);
122 }
123
124 /**
125 * Returns the high value.
126 *
127 * @param series the series index (ignored).
128 * @param item the item index (zero-based).
129 *
130 * @return The high value.
131 */
132 public Number getHigh(int series, int item) {
133 return this.data[item].getHigh();
134 }
135
136 /**
137 * Returns the high-value (as a double primitive) for an item within a
138 * series.
139 *
140 * @param series the series (zero-based index).
141 * @param item the item (zero-based index).
142 *
143 * @return The high-value.
144 */
145 public double getHighValue(int series, int item) {
146 double result = Double.NaN;
147 Number high = getHigh(series, item);
148 if (high != null) {
149 result = high.doubleValue();
150 }
151 return result;
152 }
153
154 /**
155 * Returns the low value.
156 *
157 * @param series the series index (ignored).
158 * @param item the item index (zero-based).
159 *
160 * @return The low value.
161 */
162 public Number getLow(int series, int item) {
163 return this.data[item].getLow();
164 }
165
166 /**
167 * Returns the low-value (as a double primitive) for an item within a
168 * series.
169 *
170 * @param series the series (zero-based index).
171 * @param item the item (zero-based index).
172 *
173 * @return The low-value.
174 */
175 public double getLowValue(int series, int item) {
176 double result = Double.NaN;
177 Number low = getLow(series, item);
178 if (low != null) {
179 result = low.doubleValue();
180 }
181 return result;
182 }
183
184 /**
185 * Returns the open value.
186 *
187 * @param series the series index (ignored).
188 * @param item the item index (zero-based).
189 *
190 * @return The open value.
191 */
192 public Number getOpen(int series, int item) {
193 return this.data[item].getOpen();
194 }
195
196 /**
197 * Returns the open-value (as a double primitive) for an item within a
198 * series.
199 *
200 * @param series the series (zero-based index).
201 * @param item the item (zero-based index).
202 *
203 * @return The open-value.
204 */
205 public double getOpenValue(int series, int item) {
206 double result = Double.NaN;
207 Number open = getOpen(series, item);
208 if (open != null) {
209 result = open.doubleValue();
210 }
211 return result;
212 }
213
214 /**
215 * Returns the close value.
216 *
217 * @param series the series index (ignored).
218 * @param item the item index (zero-based).
219 *
220 * @return The close value.
221 */
222 public Number getClose(int series, int item) {
223 return this.data[item].getClose();
224 }
225
226 /**
227 * Returns the close-value (as a double primitive) for an item within a
228 * series.
229 *
230 * @param series the series (zero-based index).
231 * @param item the item (zero-based index).
232 *
233 * @return The close-value.
234 */
235 public double getCloseValue(int series, int item) {
236 double result = Double.NaN;
237 Number close = getClose(series, item);
238 if (close != null) {
239 result = close.doubleValue();
240 }
241 return result;
242 }
243
244 /**
245 * Returns the trading volume.
246 *
247 * @param series the series index (ignored).
248 * @param item the item index (zero-based).
249 *
250 * @return The trading volume.
251 */
252 public Number getVolume(int series, int item) {
253 return this.data[item].getVolume();
254 }
255
256 /**
257 * Returns the volume-value (as a double primitive) for an item within a
258 * series.
259 *
260 * @param series the series (zero-based index).
261 * @param item the item (zero-based index).
262 *
263 * @return The volume-value.
264 */
265 public double getVolumeValue(int series, int item) {
266 double result = Double.NaN;
267 Number volume = getVolume(series, item);
268 if (volume != null) {
269 result = volume.doubleValue();
270 }
271 return result;
272 }
273
274 /**
275 * Returns the series count.
276 *
277 * @return 1.
278 */
279 public int getSeriesCount() {
280 return 1;
281 }
282
283 /**
284 * Returns the item count for the specified series.
285 *
286 * @param series the series index (ignored).
287 *
288 * @return The item count.
289 */
290 public int getItemCount(int series) {
291 return this.data.length;
292 }
293
294 /**
295 * Sorts the data into ascending order by date.
296 */
297 public void sortDataByDate() {
298 Arrays.sort(this.data);
299 }
300
301 /**
302 * Tests this instance for equality with an arbitrary object.
303 *
304 * @param obj the object (<code>null</code> permitted).
305 *
306 * @return A boolean.
307 */
308 public boolean equals(Object obj) {
309 if (this == obj) {
310 return true;
311 }
312 if (!(obj instanceof DefaultOHLCDataset)) {
313 return false;
314 }
315 DefaultOHLCDataset that = (DefaultOHLCDataset) obj;
316 if (!this.key.equals(that.key)) {
317 return false;
318 }
319 if (!Arrays.equals(this.data, that.data)) {
320 return false;
321 }
322 return true;
323 }
324
325 /**
326 * Returns an independent copy of this dataset.
327 *
328 * @return A clone.
329 *
330 * @throws CloneNotSupportedException
331 */
332 public Object clone() throws CloneNotSupportedException {
333 DefaultOHLCDataset clone = (DefaultOHLCDataset) super.clone();
334 clone.data = new OHLCDataItem[this.data.length];
335 System.arraycopy(this.data, 0, clone.data, 0, this.data.length);
336 return clone;
337 }
338
339 }