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     * DefaultKeyedValueDataset.java
029     * -----------------------------
030     * (C) Copyright 2003-2005, by Object Refinery Limited.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * $Id $
036     *
037     * Changes
038     * -------
039     * 27-Mar-2003 : Version 1 (DG);
040     * 18-Aug-2003 : Implemented Cloneable (DG);
041     *
042     */
043    
044    package org.jfree.data.general;
045    
046    import java.io.Serializable;
047    
048    import org.jfree.data.DefaultKeyedValue;
049    import org.jfree.data.KeyedValue;
050    import org.jfree.util.ObjectUtilities;
051    
052    /**
053     * A default implementation of the {@link KeyedValueDataset} interface.
054     */
055    public class DefaultKeyedValueDataset extends AbstractDataset
056                                          implements KeyedValueDataset, 
057                                                     Serializable {
058    
059        /** For serialization. */
060        private static final long serialVersionUID = -8149484339560406750L;
061        
062        /** Storage for the data. */
063        private KeyedValue data;
064    
065        /**
066         * Constructs a new dataset, initially empty.
067         */
068        public DefaultKeyedValueDataset() {
069            this(null);
070        }
071    
072        /**
073         * Creates a new dataset with the specified initial value.
074         *
075         * @param key  the key.
076         * @param value  the value (<code>null</code> permitted).
077         */
078        public DefaultKeyedValueDataset(Comparable key, Number value) {
079            this(new DefaultKeyedValue(key, value));
080        }
081    
082        /**
083         * Creates a new dataset that uses the data from a {@link KeyedValue} 
084         * instance.
085         *
086         * @param data  the data (<code>null</code> permitted).
087         */
088        public DefaultKeyedValueDataset(KeyedValue data) {
089            this.data = data;
090        }
091    
092        /**
093         * Returns the key associated with the value, or <code>null</code> if the 
094         * dataset has no data item.
095         *
096         * @return The key.
097         */
098        public Comparable getKey() {
099            Comparable result = null;
100            if (this.data != null) {
101                result = this.data.getKey();
102            }
103            return result;
104        }
105    
106        /**
107         * Returns the value.
108         *
109         * @return The value (possibly <code>null</code>).
110         */
111        public Number getValue() {
112            Number result = null;
113            if (this.data != null) {
114                result = this.data.getValue();
115            }
116            return result;
117        }
118    
119        /**
120         * Updates the value.
121         *
122         * @param value  the new value (<code>null</code> permitted).
123         */
124        public void updateValue(Number value) {
125            if (this.data == null) {
126                throw new RuntimeException("updateValue: can't update null.");
127            }
128            setValue(this.data.getKey(), value);
129        }
130    
131        /**
132         * Sets the value for the dataset and sends a {@link DatasetChangeEvent} to 
133         * all registered listeners.
134         *
135         * @param key  the key.
136         * @param value  the value (<code>null</code> permitted).
137         */
138        public void setValue(Comparable key, Number value) {
139            this.data = new DefaultKeyedValue(key, value);
140            notifyListeners(new DatasetChangeEvent(this, this));
141        }
142    
143        /**
144         * Tests this dataset for equality with an arbitrary object.
145         *
146         * @param obj  the object.
147         *
148         * @return A boolean.
149         */
150        public boolean equals(Object obj) {
151    
152            if (obj == this) {
153                return true;
154            }
155            if (!(obj instanceof KeyedValueDataset)) {
156                return false;
157            }
158            KeyedValueDataset that = (KeyedValueDataset) obj;
159            if (this.data == null) {
160                if (that.getKey() != null || that.getValue() != null) {
161                    return false;
162                }
163                return true;
164            }
165            if (!ObjectUtilities.equal(this.data.getKey(), that.getKey())) {
166                return false;
167            }
168            if (!ObjectUtilities.equal(this.data.getValue(), that.getValue())) {
169                return false;
170            }
171            return true;
172        }
173    
174        /**
175         * Returns a hash code.
176         * 
177         * @return A hash code.
178         */
179        public int hashCode() {
180            return (this.data != null ? this.data.hashCode() : 0);
181        }
182    
183        /**
184         * Creates a clone of the dataset.
185         * 
186         * @return A clone.
187         * 
188         * @throws CloneNotSupportedException This class will not throw this 
189         *         exception, but subclasses (if any) might.
190         */
191        public Object clone() throws CloneNotSupportedException {
192            DefaultKeyedValueDataset clone 
193                = (DefaultKeyedValueDataset) super.clone();
194            return clone;    
195        }
196        
197    }