1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2000,2008 Oracle.  All rights reserved.
5 *
6 * $Id: MapEntryParameter.java,v 12.6 2008/01/08 20:58:36 bostic Exp $
7 */
8
9package com.sleepycat.collections;
10
11import java.util.Map;
12
13/**
14 * A simple <code>Map.Entry</code> implementation that can be used as in
15 * input parameter.  Since a <code>MapEntryParameter</code> is not obtained
16 * from a map, it is not attached to any map in particular.  To emphasize that
17 * changing this object does not change the map, the {@link #setValue} method
18 * always throws <code>UnsupportedOperationException</code>.
19 *
20 * <p><b>Warning:</b> Use of this interface violates the Java Collections
21 * interface contract since these state that <code>Map.Entry</code> objects
22 * should only be obtained from <code>Map.entrySet()</code> sets, while this
23 * class allows constructing them directly.  However, it is useful for
24 * performing operations on an entry set such as add(), contains(), etc.  For
25 * restrictions see {@link #getValue} and {@link #setValue}.</p>
26 *
27 * @author Mark Hayes
28 */
29public class MapEntryParameter implements Map.Entry {
30
31    private Object key;
32    private Object value;
33
34    /**
35     * Creates a map entry with a given key and value.
36     *
37     * @param key is the key to use.
38     *
39     * @param value is the value to use.
40     */
41    public MapEntryParameter(Object key, Object value) {
42
43        this.key = key;
44        this.value = value;
45    }
46
47    /**
48     * Computes a hash code as specified by {@link
49     * java.util.Map.Entry#hashCode}.
50     *
51     * @return the computed hash code.
52     */
53    public int hashCode() {
54
55        return ((key == null)    ? 0 : key.hashCode()) ^
56               ((value == null)  ? 0 : value.hashCode());
57    }
58
59    /**
60     * Compares this entry to a given entry as specified by {@link
61     * java.util.Map.Entry#equals}.
62     *
63     * @return the computed hash code.
64     */
65    public boolean equals(Object other) {
66
67        if (!(other instanceof Map.Entry)) {
68            return false;
69        }
70
71        Map.Entry e = (Map.Entry) other;
72
73        return ((key == null) ? (e.getKey() == null)
74                              : key.equals(e.getKey())) &&
75               ((value == null) ? (e.getValue() == null)
76                                : value.equals(e.getValue()));
77    }
78
79    /**
80     * Returns the key of this entry.
81     *
82     * @return the key of this entry.
83     */
84    public final Object getKey() {
85
86        return key;
87    }
88
89    /**
90     * Returns the value of this entry.  Note that this will be the value
91     * passed to the constructor or the last value passed to {@link #setValue}.
92     * It will not reflect changes made to a Map.
93     *
94     * @return the value of this entry.
95     */
96    public final Object getValue() {
97
98        return value;
99    }
100
101    /**
102     * Always throws <code>UnsupportedOperationException</code> since this
103     * object is not attached to a map.
104     */
105    public Object setValue(Object newValue) {
106
107        throw new UnsupportedOperationException();
108    }
109
110    final void setValueInternal(Object newValue) {
111
112        this.value = newValue;
113    }
114
115    /**
116     * Converts the entry to a string representation for debugging.
117     *
118     * @return the string representation.
119     */
120    public String toString() {
121
122        return "[key [" + key + "] value [" + value + ']';
123    }
124}
125
126