001/* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2009, 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 * SubseriesDataset.java
029 * ---------------------
030 * (C) Copyright 2001-2009, by Bill Kelemen and Contributors.
031 *
032 * Original Author:  Bill Kelemen;
033 * Contributor(s):   Sylvain Vieujot;
034 *                   David Gilbert (for Object Refinery Limited);
035 *
036 * Changes
037 * -------
038 * 06-Dec-2001 : Version 1 (BK);
039 * 05-Feb-2002 : Added SignalsDataset (and small change to HighLowDataset
040 *               interface) as requested by Sylvain Vieujot (DG);
041 * 28-Feb-2002 : Fixed bug: missing map[series] in IntervalXYDataset and
042 *               SignalsDataset methods (BK);
043 * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
044 * 06-May-2004 : Now extends AbstractIntervalXYDataset (DG);
045 * 15-Jul-2004 : Switched getX() with getXValue() and getY() with
046 *               getYValue() (DG);
047 * 29-Nov-2005 : Removed SignalsDataset (DG);
048 * ------------- JFREECHART 1.0.x ---------------------------------------------
049 * 02-Feb-2007 : Removed author tags from all over JFreeChart sources (DG);
050 * 04-Feb-2009 : Deprecated, this class won't be supported in version
051 *               1.2.0 (DG);
052 *
053 */
054
055package org.jfree.data.general;
056
057import org.jfree.data.xy.AbstractIntervalXYDataset;
058import org.jfree.data.xy.IntervalXYDataset;
059import org.jfree.data.xy.OHLCDataset;
060import org.jfree.data.xy.XYDataset;
061
062/**
063 * This class will create a dataset with one or more series from another
064 * {@link SeriesDataset}.
065 *
066 * @deprecated As of version 1.0.13.  This class will be removed from
067 *     JFreeChart 1.2.0 onwards.  Anyone needing this facility will need to
068 *     maintain it outside of JFreeChart.
069 */
070public class SubSeriesDataset extends AbstractIntervalXYDataset
071        implements OHLCDataset, IntervalXYDataset, CombinationDataset {
072
073    /** The parent dataset. */
074    private SeriesDataset parent = null;
075
076    /** Storage for map. */
077    private int[] map;  // maps our series into our parent's
078
079    /**
080     * Creates a SubSeriesDataset using one or more series from
081     * <code>parent</code>.  The series to use are passed as an array of int.
082     *
083     * @param parent  underlying dataset
084     * @param map  int[] of series from parent to include in this Dataset
085     */
086    public SubSeriesDataset(SeriesDataset parent, int[] map) {
087        this.parent = parent;
088        this.map = map;
089    }
090
091    /**
092     * Creates a SubSeriesDataset using one series from <code>parent</code>.
093     * The series to is passed as an int.
094     *
095     * @param parent  underlying dataset
096     * @param series  series from parent to include in this Dataset
097     */
098    public SubSeriesDataset(SeriesDataset parent, int series) {
099        this(parent, new int[] {series});
100    }
101
102    ///////////////////////////////////////////////////////////////////////////
103    // From HighLowDataset
104    ///////////////////////////////////////////////////////////////////////////
105
106    /**
107     * Returns the high-value for the specified series and item.
108     * <p>
109     * Note: throws <code>ClassCastException</code> if the series if not from a
110     * {@link OHLCDataset}.
111     *
112     * @param series  the index of the series of interest (zero-based).
113     * @param item  the index of the item of interest (zero-based).
114     *
115     * @return The high-value for the specified series and item.
116     */
117    public Number getHigh(int series, int item) {
118        return ((OHLCDataset) this.parent).getHigh(this.map[series], item);
119    }
120
121    /**
122     * Returns the high-value (as a double primitive) for an item within a
123     * series.
124     *
125     * @param series  the series (zero-based index).
126     * @param item  the item (zero-based index).
127     *
128     * @return The high-value.
129     */
130    public double getHighValue(int series, int item) {
131        double result = Double.NaN;
132        Number high = getHigh(series, item);
133        if (high != null) {
134            result = high.doubleValue();
135        }
136        return result;
137    }
138
139    /**
140     * Returns the low-value for the specified series and item.
141     * <p>
142     * Note: throws <code>ClassCastException</code> if the series if not from a
143     * {@link OHLCDataset}.
144     *
145     * @param series  the index of the series of interest (zero-based).
146     * @param item  the index of the item of interest (zero-based).
147     *
148     * @return The low-value for the specified series and item.
149     */
150    public Number getLow(int series, int item) {
151        return ((OHLCDataset) this.parent).getLow(this.map[series], item);
152    }
153
154    /**
155     * Returns the low-value (as a double primitive) for an item within a
156     * series.
157     *
158     * @param series  the series (zero-based index).
159     * @param item  the item (zero-based index).
160     *
161     * @return The low-value.
162     */
163    public double getLowValue(int series, int item) {
164        double result = Double.NaN;
165        Number low = getLow(series, item);
166        if (low != null) {
167            result = low.doubleValue();
168        }
169        return result;
170    }
171
172    /**
173     * Returns the open-value for the specified series and item.
174     * <p>
175     * Note: throws <code>ClassCastException</code> if the series if not from a
176     * {@link OHLCDataset}.
177     *
178     * @param series  the index of the series of interest (zero-based).
179     * @param item  the index of the item of interest (zero-based).
180     *
181     * @return The open-value for the specified series and item.
182     */
183    public Number getOpen(int series, int item) {
184        return ((OHLCDataset) this.parent).getOpen(this.map[series], item);
185    }
186
187    /**
188     * Returns the open-value (as a double primitive) for an item within a
189     * series.
190     *
191     * @param series  the series (zero-based index).
192     * @param item  the item (zero-based index).
193     *
194     * @return The open-value.
195     */
196    public double getOpenValue(int series, int item) {
197        double result = Double.NaN;
198        Number open = getOpen(series, item);
199        if (open != null) {
200            result = open.doubleValue();
201        }
202        return result;
203    }
204
205    /**
206     * Returns the close-value for the specified series and item.
207     * <p>
208     * Note: throws <code>ClassCastException</code> if the series if not from a
209     * {@link OHLCDataset}.
210     *
211     * @param series  the index of the series of interest (zero-based).
212     * @param item  the index of the item of interest (zero-based).
213     *
214     * @return The close-value for the specified series and item.
215     */
216    public Number getClose(int series, int item) {
217        return ((OHLCDataset) this.parent).getClose(this.map[series], item);
218    }
219
220    /**
221     * Returns the close-value (as a double primitive) for an item within a
222     * series.
223     *
224     * @param series  the series (zero-based index).
225     * @param item  the item (zero-based index).
226     *
227     * @return The close-value.
228     */
229    public double getCloseValue(int series, int item) {
230        double result = Double.NaN;
231        Number close = getClose(series, item);
232        if (close != null) {
233            result = close.doubleValue();
234        }
235        return result;
236    }
237
238    /**
239     * Returns the volume.
240     * <p>
241     * Note: throws <code>ClassCastException</code> if the series if not from a
242     * {@link OHLCDataset}.
243     *
244     * @param series  the series (zero based index).
245     * @param item  the item (zero based index).
246     *
247     * @return The volume.
248     */
249    public Number getVolume(int series, int item) {
250        return ((OHLCDataset) this.parent).getVolume(this.map[series], item);
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    // From XYDataset
273    ///////////////////////////////////////////////////////////////////////////
274
275    /**
276     * Returns the X-value for the specified series and item.
277     * <p>
278     * Note: throws <code>ClassCastException</code> if the series if not from a
279     * {@link XYDataset}.
280     *
281     * @param series  the index of the series of interest (zero-based);
282     * @param item  the index of the item of interest (zero-based).
283     *
284     * @return The X-value for the specified series and item.
285     */
286    public Number getX(int series, int item) {
287        return ((XYDataset) this.parent).getX(this.map[series], item);
288    }
289
290    /**
291     * Returns the Y-value for the specified series and item.
292     * <p>
293     * Note: throws <code>ClassCastException</code> if the series if not from a
294     * {@link XYDataset}.
295     *
296     * @param series  the index of the series of interest (zero-based).
297     * @param item  the index of the item of interest (zero-based).
298     *
299     * @return The Y-value for the specified series and item.
300     */
301    public Number getY(int series, int item) {
302        return ((XYDataset) this.parent).getY(this.map[series], item);
303    }
304
305    /**
306     * Returns the number of items in a series.
307     * <p>
308     * Note: throws <code>ClassCastException</code> if the series if not from a
309     * {@link XYDataset}.
310     *
311     * @param series  the index of the series of interest (zero-based).
312     *
313     * @return The number of items in a series.
314     */
315    public int getItemCount(int series) {
316        return ((XYDataset) this.parent).getItemCount(this.map[series]);
317    }
318
319    ///////////////////////////////////////////////////////////////////////////
320    // From SeriesDataset
321    ///////////////////////////////////////////////////////////////////////////
322
323    /**
324     * Returns the number of series in the dataset.
325     *
326     * @return The number of series in the dataset.
327     */
328    public int getSeriesCount() {
329        return this.map.length;
330    }
331
332    /**
333     * Returns the key for a series.
334     *
335     * @param series  the series (zero-based index).
336     *
337     * @return The name of a series.
338     */
339    public Comparable getSeriesKey(int series) {
340        return this.parent.getSeriesKey(this.map[series]);
341    }
342
343    ///////////////////////////////////////////////////////////////////////////
344    // From IntervalXYDataset
345    ///////////////////////////////////////////////////////////////////////////
346
347    /**
348     * Returns the starting X value for the specified series and item.
349     *
350     * @param series  the index of the series of interest (zero-based).
351     * @param item  the index of the item of interest (zero-based).
352     *
353     * @return The starting X value for the specified series and item.
354     */
355    public Number getStartX(int series, int item) {
356        if (this.parent instanceof IntervalXYDataset) {
357            return ((IntervalXYDataset) this.parent).getStartX(
358                this.map[series], item
359            );
360        }
361        else {
362            return getX(series, item);
363        }
364    }
365
366    /**
367     * Returns the ending X value for the specified series and item.
368     *
369     * @param series  the index of the series of interest (zero-based).
370     * @param item  the index of the item of interest (zero-based).
371     *
372     * @return The ending X value for the specified series and item.
373     */
374    public Number getEndX(int series, int item) {
375        if (this.parent instanceof IntervalXYDataset) {
376            return ((IntervalXYDataset) this.parent).getEndX(
377                this.map[series], item
378            );
379        }
380        else {
381            return getX(series, item);
382        }
383    }
384
385    /**
386     * Returns the starting Y value for the specified series and item.
387     *
388     * @param series  the index of the series of interest (zero-based).
389     * @param item  the index of the item of interest (zero-based).
390     *
391     * @return The starting Y value for the specified series and item.
392     */
393    public Number getStartY(int series, int item) {
394        if (this.parent instanceof IntervalXYDataset) {
395            return ((IntervalXYDataset) this.parent).getStartY(
396                this.map[series], item
397            );
398        }
399        else {
400            return getY(series, item);
401        }
402    }
403
404    /**
405     * Returns the ending Y value for the specified series and item.
406     *
407     * @param series  the index of the series of interest (zero-based).
408     * @param item  the index of the item of interest (zero-based).
409     *
410     * @return The ending Y value for the specified series and item.
411     */
412    public Number getEndY(int series,  int item) {
413        if (this.parent instanceof IntervalXYDataset) {
414            return ((IntervalXYDataset) this.parent).getEndY(
415                this.map[series], item
416            );
417        }
418        else {
419            return getY(series, item);
420        }
421    }
422
423    ///////////////////////////////////////////////////////////////////////////
424    // New methods from CombinationDataset
425    ///////////////////////////////////////////////////////////////////////////
426
427    /**
428     * Returns the parent Dataset of this combination.
429     *
430     * @return The parent Dataset of this combination.
431     */
432    public SeriesDataset getParent() {
433        return this.parent;
434    }
435
436    /**
437     * Returns a map or indirect indexing form our series into parent's series.
438     *
439     * @return A map or indirect indexing form our series into parent's series.
440     */
441    public int[] getMap() {
442        return (int[]) this.map.clone();
443    }
444
445}