Frames | No Frames |
1: /* =========================================================== 2: * JFreeChart : a free chart library for the Java(tm) platform 3: * =========================================================== 4: * 5: * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 6: * 7: * Project Info: http://www.jfree.org/jfreechart/index.html 8: * 9: * This library is free software; you can redistribute it and/or modify it 10: * under the terms of the GNU Lesser General Public License as published by 11: * the Free Software Foundation; either version 2.1 of the License, or 12: * (at your option) any later version. 13: * 14: * This library is distributed in the hope that it will be useful, but 15: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17: * License for more details. 18: * 19: * You should have received a copy of the GNU Lesser General Public 20: * License along with this library; if not, write to the Free Software 21: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 22: * USA. 23: * 24: * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 25: * in the United States and other countries.] 26: * 27: * -------------------------- 28: * DefaultHighLowDataset.java 29: * -------------------------- 30: * (C) Copyright 2002-2005, by Object Refinery Limited. 31: * 32: * Original Author: David Gilbert (for Object Refinery Limited); 33: * Contributor(s): -; 34: * 35: * $Id: DefaultHighLowDataset.java,v 1.6.2.1 2005/10/25 21:36:51 mungady Exp $ 36: * 37: * Changes 38: * ------- 39: * 21-Mar-2002 : Version 1 (DG); 40: * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG); 41: * 06-May-2004 : Now extends AbstractXYDataset and added new methods from 42: * HighLowDataset (DG); 43: * 15-Jul-2004 : Switched getX() with getXValue() and getY() with 44: * getYValue() (DG); 45: * 46: */ 47: 48: package org.jfree.data.xy; 49: 50: import java.util.Date; 51: 52: /** 53: * A simple implementation of the {@link OHLCDataset}. 54: */ 55: public class DefaultHighLowDataset extends AbstractXYDataset 56: implements OHLCDataset { 57: 58: /** The series key. */ 59: private Comparable seriesKey; 60: 61: /** Storage for the dates. */ 62: private Date[] date; 63: 64: /** Storage for the high values. */ 65: private Number[] high; 66: 67: /** Storage for the low values. */ 68: private Number[] low; 69: 70: /** Storage for the open values. */ 71: private Number[] open; 72: 73: /** Storage for the close values. */ 74: private Number[] close; 75: 76: /** Storage for the volume values. */ 77: private Number[] volume; 78: 79: /** 80: * Constructs a new high/low/open/close dataset. 81: * <p> 82: * The current implementation allows only one series in the dataset. 83: * This may be extended in a future version. 84: * 85: * @param seriesKey the key for the series. 86: * @param date the dates. 87: * @param high the high values. 88: * @param low the low values. 89: * @param open the open values. 90: * @param close the close values. 91: * @param volume the volume values. 92: */ 93: public DefaultHighLowDataset(Comparable seriesKey, 94: Date[] date, 95: double[] high, final double[] low, 96: double[] open, final double[] close, 97: double[] volume) { 98: 99: this.seriesKey = seriesKey; 100: this.date = date; 101: this.high = createNumberArray(high); 102: this.low = createNumberArray(low); 103: this.open = createNumberArray(open); 104: this.close = createNumberArray(close); 105: this.volume = createNumberArray(volume); 106: 107: } 108: 109: /** 110: * Returns the for the series stored in this dataset. 111: * 112: * @param i the index of the series. Currently ignored. 113: * 114: * @return The key for this series. 115: */ 116: public Comparable getSeriesKey(int i) { 117: return this.seriesKey; 118: } 119: 120: /** 121: * Returns the x-value for one item in a series. The value returned is a 122: * <code>Long</code> instance generated from the underlying 123: * <code>Date</code> object. 124: * 125: * @param series the series (zero-based index). 126: * @param item the item (zero-based index). 127: * 128: * @return The x-value. 129: */ 130: public Number getX(int series, int item) { 131: return new Long(this.date[item].getTime()); 132: } 133: 134: /** 135: * Returns the x-value for one item in a series, as a Date. 136: * <p> 137: * This method is provided for convenience only. 138: * 139: * @param series the series (zero-based index). 140: * @param item the item (zero-based index). 141: * 142: * @return The x-value as a Date. 143: */ 144: public Date getXDate(int series, int item) { 145: return this.date[item]; 146: } 147: 148: /** 149: * Returns the y-value for one item in a series. 150: * <p> 151: * This method (from the {@link XYDataset} interface) is mapped to the 152: * {@link #getCloseValue(int, int)} method. 153: * 154: * @param series the series (zero-based index). 155: * @param item the item (zero-based index). 156: * 157: * @return The y-value. 158: */ 159: public Number getY(int series, int item) { 160: return getClose(series, item); 161: } 162: 163: /** 164: * Returns the high-value for one item in a series. 165: * 166: * @param series the series (zero-based index). 167: * @param item the item (zero-based index). 168: * 169: * @return The high-value. 170: */ 171: public Number getHigh(int series, int item) { 172: return this.high[item]; 173: } 174: 175: /** 176: * Returns the high-value (as a double primitive) for an item within a 177: * series. 178: * 179: * @param series the series (zero-based index). 180: * @param item the item (zero-based index). 181: * 182: * @return The high-value. 183: */ 184: public double getHighValue(int series, int item) { 185: double result = Double.NaN; 186: Number high = getHigh(series, item); 187: if (high != null) { 188: result = high.doubleValue(); 189: } 190: return result; 191: } 192: 193: /** 194: * Returns the low-value for one item in a series. 195: * 196: * @param series the series (zero-based index). 197: * @param item the item (zero-based index). 198: * 199: * @return The low-value. 200: */ 201: public Number getLow(int series, int item) { 202: return this.low[item]; 203: } 204: 205: /** 206: * Returns the low-value (as a double primitive) for an item within a 207: * series. 208: * 209: * @param series the series (zero-based index). 210: * @param item the item (zero-based index). 211: * 212: * @return The low-value. 213: */ 214: public double getLowValue(int series, int item) { 215: double result = Double.NaN; 216: Number low = getLow(series, item); 217: if (low != null) { 218: result = low.doubleValue(); 219: } 220: return result; 221: } 222: 223: /** 224: * Returns the open-value for one item in a series. 225: * 226: * @param series the series (zero-based index). 227: * @param item the item (zero-based index). 228: * 229: * @return The open-value. 230: */ 231: public Number getOpen(int series, int item) { 232: return this.open[item]; 233: } 234: 235: /** 236: * Returns the open-value (as a double primitive) for an item within a 237: * series. 238: * 239: * @param series the series (zero-based index). 240: * @param item the item (zero-based index). 241: * 242: * @return The open-value. 243: */ 244: public double getOpenValue(int series, int item) { 245: double result = Double.NaN; 246: Number open = getOpen(series, item); 247: if (open != null) { 248: result = open.doubleValue(); 249: } 250: return result; 251: } 252: 253: /** 254: * Returns the close-value for one item in a series. 255: * 256: * @param series the series (zero-based index). 257: * @param item the item (zero-based index). 258: * 259: * @return The close-value. 260: */ 261: public Number getClose(int series, int item) { 262: return this.close[item]; 263: } 264: 265: /** 266: * Returns the close-value (as a double primitive) for an item within a 267: * series. 268: * 269: * @param series the series (zero-based index). 270: * @param item the item (zero-based index). 271: * 272: * @return The close-value. 273: */ 274: public double getCloseValue(int series, int item) { 275: double result = Double.NaN; 276: Number close = getClose(series, item); 277: if (close != null) { 278: result = close.doubleValue(); 279: } 280: return result; 281: } 282: 283: /** 284: * Returns the volume-value for one item in a series. 285: * 286: * @param series the series (zero-based index). 287: * @param item the item (zero-based index). 288: * 289: * @return The volume-value. 290: */ 291: public Number getVolume(int series, int item) { 292: return this.volume[item]; 293: } 294: 295: /** 296: * Returns the volume-value (as a double primitive) for an item within a 297: * series. 298: * 299: * @param series the series (zero-based index). 300: * @param item the item (zero-based index). 301: * 302: * @return The volume-value. 303: */ 304: public double getVolumeValue(int series, int item) { 305: double result = Double.NaN; 306: Number volume = getVolume(series, item); 307: if (volume != null) { 308: result = volume.doubleValue(); 309: } 310: return result; 311: } 312: 313: /** 314: * Returns the number of series in the dataset. 315: * <p> 316: * This implementation only allows one series. 317: * 318: * @return The number of series. 319: */ 320: public int getSeriesCount() { 321: return 1; 322: } 323: 324: /** 325: * Returns the number of items in the specified series. 326: * 327: * @param series the index (zero-based) of the series. 328: * 329: * @return The number of items in the specified series. 330: */ 331: public int getItemCount(int series) { 332: return this.date.length; 333: } 334: 335: /** 336: * Constructs an array of Number objects from an array of doubles. 337: * 338: * @param data the double values to convert. 339: * 340: * @return The data as an array of Number objects. 341: */ 342: public static Number[] createNumberArray(double[] data) { 343: Number[] result = new Number[data.length]; 344: for (int i = 0; i < data.length; i++) { 345: result[i] = new Double(data[i]); 346: } 347: return result; 348: } 349: 350: }