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 implements
056: KeyedValueDataset, Serializable {
057:
058: /** For serialization. */
059: private static final long serialVersionUID = -8149484339560406750L;
060:
061: /** Storage for the data. */
062: private KeyedValue data;
063:
064: /**
065: * Constructs a new dataset, initially empty.
066: */
067: public DefaultKeyedValueDataset() {
068: this (null);
069: }
070:
071: /**
072: * Creates a new dataset with the specified initial value.
073: *
074: * @param key the key.
075: * @param value the value (<code>null</code> permitted).
076: */
077: public DefaultKeyedValueDataset(Comparable key, Number value) {
078: this (new DefaultKeyedValue(key, value));
079: }
080:
081: /**
082: * Creates a new dataset that uses the data from a {@link KeyedValue}
083: * instance.
084: *
085: * @param data the data (<code>null</code> permitted).
086: */
087: public DefaultKeyedValueDataset(KeyedValue data) {
088: this .data = data;
089: }
090:
091: /**
092: * Returns the key associated with the value, or <code>null</code> if the
093: * dataset has no data item.
094: *
095: * @return The key.
096: */
097: public Comparable getKey() {
098: Comparable result = null;
099: if (this .data != null) {
100: result = this .data.getKey();
101: }
102: return result;
103: }
104:
105: /**
106: * Returns the value.
107: *
108: * @return The value (possibly <code>null</code>).
109: */
110: public Number getValue() {
111: Number result = null;
112: if (this .data != null) {
113: result = this .data.getValue();
114: }
115: return result;
116: }
117:
118: /**
119: * Updates the value.
120: *
121: * @param value the new value (<code>null</code> permitted).
122: */
123: public void updateValue(Number value) {
124: if (this .data == null) {
125: throw new RuntimeException(
126: "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
169: .getValue())) {
170: return false;
171: }
172: return true;
173: }
174:
175: /**
176: * Returns a hash code.
177: *
178: * @return A hash code.
179: */
180: public int hashCode() {
181: return (this .data != null ? this .data.hashCode() : 0);
182: }
183:
184: /**
185: * Creates a clone of the dataset.
186: *
187: * @return A clone.
188: *
189: * @throws CloneNotSupportedException This class will not throw this
190: * exception, but subclasses (if any) might.
191: */
192: public Object clone() throws CloneNotSupportedException {
193: DefaultKeyedValueDataset clone = (DefaultKeyedValueDataset) super
194: .clone();
195: return clone;
196: }
197:
198: }
|