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