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 }