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