This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-beanutils.git


The following commit(s) were added to refs/heads/master by this push:
     new ad0c46f  Formatting.
ad0c46f is described below

commit ad0c46f678d5da2274ca08e4555fa9b557e51404
Author: Gary Gregory <[email protected]>
AuthorDate: Sun Oct 20 18:39:25 2019 -0400

    Formatting.
---
 .../beanutils2/BaseDynaBeanMapDecorator.java       | 797 +++++++++++----------
 1 file changed, 402 insertions(+), 395 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/beanutils2/BaseDynaBeanMapDecorator.java 
b/src/main/java/org/apache/commons/beanutils2/BaseDynaBeanMapDecorator.java
index 5e21f83..9504501 100644
--- a/src/main/java/org/apache/commons/beanutils2/BaseDynaBeanMapDecorator.java
+++ b/src/main/java/org/apache/commons/beanutils2/BaseDynaBeanMapDecorator.java
@@ -1,395 +1,402 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.beanutils2;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * <p>A base class for decorators providing <code>Map</code> behavior on
- * {@link DynaBean}s.</p>
- *
- * <p>The motivation for this implementation is to provide access to {@link 
DynaBean}
- *    properties in technologies that are unaware of BeanUtils and {@link 
DynaBean}s -
- *    such as the expression languages of JSTL and JSF.</p>
- *
- * <p>This rather technical base class implements the methods of the
- *    {@code Map} interface on top of a {@code DynaBean}. It was introduced
- *    to handle generic parameters in a meaningful way without breaking
- *    backwards compatibility of the 1.x {@code DynaBeanMapDecorator} class: A
- *    map wrapping a {@code DynaBean} should be of type {@code Map<String, 
Object>}.
- *    However, when using these generic parameters in {@code 
DynaBeanMapDecorator}
- *    this would be an incompatible change (as method signatures would have to
- *    be adapted). To solve this problem, this generic base class is added
- *    which allows specifying the key type as parameter. This makes it easy to
- *    have a new subclass using the correct generic parameters while
- *    {@code DynaBeanMapDecorator} could still remain with compatible
- *    parameters.</p>
- *
- * @param <K> the type of the keys in the decorated map
- * @since BeanUtils 1.9.0
- */
-public abstract class BaseDynaBeanMapDecorator<K> implements Map<K, Object> {
-
-    private final DynaBean dynaBean;
-    private final boolean readOnly;
-    private transient Set<K> keySet;
-
-    // ------------------- Constructors ----------------------------------
-
-    /**
-     * Constructs a read only Map for the specified
-     * {@link DynaBean}.
-     *
-     * @param dynaBean The dyna bean being decorated
-     * @throws IllegalArgumentException if the {@link DynaBean} is null.
-     */
-    public BaseDynaBeanMapDecorator(final DynaBean dynaBean) {
-        this(dynaBean, true);
-    }
-
-    /**
-     * Construct a Map for the specified {@link DynaBean}.
-     *
-     * @param dynaBean The dyna bean being decorated
-     * @param readOnly <code>true</code> if the Map is read only
-     * otherwise <code>false</code>
-     * @throws IllegalArgumentException if the {@link DynaBean} is null.
-     */
-    public BaseDynaBeanMapDecorator(final DynaBean dynaBean, final boolean 
readOnly) {
-        if (dynaBean == null) {
-            throw new IllegalArgumentException("DynaBean is null");
-        }
-        this.dynaBean = dynaBean;
-        this.readOnly = readOnly;
-    }
-
-
-    // ------------------- public Methods --------------------------------
-
-
-    /**
-     * Indicate whether the Map is read only.
-     *
-     * @return <code>true</code> if the Map is read only,
-     * otherwise <code>false</code>.
-     */
-    public boolean isReadOnly() {
-        return readOnly;
-    }
-
-    // ------------------- java.util.Map Methods -------------------------
-
-    /**
-     * clear() operation is not supported.
-     *
-     * @throws UnsupportedOperationException This operation is not yet 
supported
-     */
-    @Override
-    public void clear() {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Indicate whether the {@link DynaBean} contains a specified
-     * value for one (or more) of its properties.
-     *
-     * @param key The {@link DynaBean}'s property name
-     * @return <code>true</code> if one of the {@link DynaBean}'s
-     * properties contains a specified value.
-     */
-    @Override
-    public boolean containsKey(final Object key) {
-        final DynaClass dynaClass = getDynaBean().getDynaClass();
-        final DynaProperty dynaProperty = 
dynaClass.getDynaProperty(toString(key));
-        return dynaProperty == null ? false : true;
-    }
-
-    /**
-     * Indicates whether the decorated {@link DynaBean} contains
-     * a specified value.
-     *
-     * @param value The value to check for.
-     * @return <code>true</code> if one of the the {@link DynaBean}'s
-     * properties contains the specified value, otherwise
-     * <code>false</code>.
-     */
-    @Override
-    public boolean containsValue(final Object value) {
-        final DynaProperty[] properties = getDynaProperties();
-        for (final DynaProperty propertie : properties) {
-            final String key = propertie.getName();
-            final Object prop = getDynaBean().get(key);
-            if (value == null) {
-                if (prop == null) {
-                    return true;
-                }
-            } else {
-                if (value.equals(prop)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * <p>Returns the Set of the property/value mappings
-     * in the decorated {@link DynaBean}.</p>
-     *
-     * <p>Each element in the Set is a <code>Map.Entry</code>
-     * type.</p>
-     *
-     * @return An unmodifiable set of the DynaBean
-     * property name/value pairs
-     */
-    @Override
-    public Set<Map.Entry<K, Object>> entrySet() {
-        final DynaProperty[] properties = getDynaProperties();
-        final Set<Map.Entry<K, Object>> set = new HashSet<>(properties.length);
-        for (final DynaProperty propertie : properties) {
-            final K key = convertKey(propertie.getName());
-            final Object value = getDynaBean().get(propertie.getName());
-            set.add(new MapEntry<>(key, value));
-        }
-        return Collections.unmodifiableSet(set);
-    }
-
-    /**
-     * Return the value for the specified key from
-     * the decorated {@link DynaBean}.
-     *
-     * @param key The {@link DynaBean}'s property name
-     * @return The value for the specified property.
-     */
-    @Override
-    public Object get(final Object key) {
-        return getDynaBean().get(toString(key));
-    }
-
-    /**
-     * Indicate whether the decorated {@link DynaBean} has
-     * any properties.
-     *
-     * @return <code>true</code> if the {@link DynaBean} has
-     * no properties, otherwise <code>false</code>.
-     */
-    @Override
-    public boolean isEmpty() {
-        return getDynaProperties().length == 0;
-    }
-
-    /**
-     * <p>Returns the Set of the property
-     * names in the decorated {@link DynaBean}.</p>
-     *
-     * <p><b>N.B.</b>For {@link DynaBean}s whose associated {@link DynaClass}
-     * is a {@link MutableDynaClass} a new Set is created every
-     * time, otherwise the Set is created only once and cached.</p>
-     *
-     * @return An unmodifiable set of the {@link DynaBean}s
-     * property names.
-     */
-    @Override
-    public Set<K> keySet() {
-        if (keySet != null) {
-            return keySet;
-        }
-
-        // Create a Set of the keys
-        final DynaProperty[] properties = getDynaProperties();
-        Set<K> set = new HashSet<>(properties.length);
-        for (final DynaProperty propertie : properties) {
-            set.add(convertKey(propertie.getName()));
-        }
-        set = Collections.unmodifiableSet(set);
-
-        // Cache the keySet if Not a MutableDynaClass
-        final DynaClass dynaClass = getDynaBean().getDynaClass();
-        if (!(dynaClass instanceof MutableDynaClass)) {
-            keySet = set;
-        }
-
-        return set;
-
-    }
-
-    /**
-     * Set the value for the specified property in
-     * the decorated {@link DynaBean}.
-     *
-     * @param key The {@link DynaBean}'s property name
-     * @param value The value for the specified property.
-     * @return The previous property's value.
-     * @throws UnsupportedOperationException if
-     * <code>isReadOnly()</code> is true.
-     */
-    @Override
-    public Object put(final K key, final Object value) {
-        if (isReadOnly()) {
-            throw new UnsupportedOperationException("Map is read only");
-        }
-        final String property = toString(key);
-        final Object previous = getDynaBean().get(property);
-        getDynaBean().set(property, value);
-        return previous;
-    }
-
-    /**
-     * Copy the contents of a Map to the decorated {@link DynaBean}.
-     *
-     * @param map The Map of values to copy.
-     * @throws UnsupportedOperationException if
-     * <code>isReadOnly()</code> is true.
-     */
-    @Override
-    public void putAll(final Map<? extends K, ? extends Object> map) {
-        if (isReadOnly()) {
-            throw new UnsupportedOperationException("Map is read only");
-        }
-        for (final Map.Entry<? extends K, ?> e : map.entrySet()) {
-            put(e.getKey(), e.getValue());
-        }
-    }
-
-    /**
-     * remove() operation is not supported.
-     *
-     * @param key The {@link DynaBean}'s property name
-     * @return the value removed
-     * @throws UnsupportedOperationException This operation is not yet 
supported
-     */
-    @Override
-    public Object remove(final Object key) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Returns the number properties in the decorated
-     * {@link DynaBean}.
-     * @return The number of properties.
-     */
-    @Override
-    public int size() {
-        return getDynaProperties().length;
-    }
-
-    /**
-     * Returns the set of property values in the
-     * decorated {@link DynaBean}.
-     *
-     * @return Unmodifiable collection of values.
-     */
-    @Override
-    public Collection<Object> values() {
-        final DynaProperty[] properties = getDynaProperties();
-        final List<Object> values = new ArrayList<>(properties.length);
-        for (final DynaProperty propertie : properties) {
-            final String key = propertie.getName();
-            final Object value = getDynaBean().get(key);
-            values.add(value);
-        }
-        return Collections.unmodifiableList(values);
-    }
-
-    // ------------------- protected Methods -----------------------------
-
-    /**
-     * Provide access to the underlying {@link DynaBean}
-     * this Map decorates.
-     *
-     * @return the decorated {@link DynaBean}.
-     */
-    public DynaBean getDynaBean() {
-        return dynaBean;
-    }
-
-    /**
-     * Converts the name of a property to the key type of this decorator.
-     *
-     * @param propertyName the name of a property
-     * @return the converted key to be used in the decorated map
-     */
-    protected abstract K convertKey(String propertyName);
-
-    // ------------------- private Methods -------------------------------
-
-    /**
-     * Convenience method to retrieve the {@link DynaProperty}s
-     * for this {@link DynaClass}.
-     *
-     * @return The an array of the {@link DynaProperty}s.
-     */
-    private DynaProperty[] getDynaProperties() {
-        return getDynaBean().getDynaClass().getDynaProperties();
-    }
-
-    /**
-     * Convenience method to convert an Object
-     * to a String.
-     *
-     * @param obj The Object to convert
-     * @return String representation of the object
-     */
-    private String toString(final Object obj) {
-        return obj == null ? null : obj.toString();
-    }
-
-    /**
-     * Map.Entry implementation.
-     */
-    private static class MapEntry<K> implements Map.Entry<K, Object> {
-        private final K key;
-        private final Object value;
-        MapEntry(final K key, final Object value) {
-            this.key = key;
-            this.value = value;
-        }
-        @Override
-        public boolean equals(final Object o) {
-            if (!(o instanceof Map.Entry)) {
-                return false;
-            }
-            final Map.Entry<?, ?> e = (Map.Entry<?, ?>)o;
-            return key.equals(e.getKey()) &&
-                    (value == null ? e.getValue() == null
-                                   : value.equals(e.getValue()));
-        }
-        @Override
-        public int hashCode() {
-            return key.hashCode() + (value == null ? 0 : value.hashCode());
-        }
-        @Override
-        public K getKey() {
-            return key;
-        }
-        @Override
-        public Object getValue() {
-            return value;
-        }
-        @Override
-        public Object setValue(final Object value) {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.beanutils2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <p>A base class for decorators providing <code>Map</code> behavior on
+ * {@link DynaBean}s.</p>
+ *
+ * <p>The motivation for this implementation is to provide access to {@link 
DynaBean}
+ *    properties in technologies that are unaware of BeanUtils and {@link 
DynaBean}s -
+ *    such as the expression languages of JSTL and JSF.</p>
+ *
+ * <p>This rather technical base class implements the methods of the
+ *    {@code Map} interface on top of a {@code DynaBean}. It was introduced
+ *    to handle generic parameters in a meaningful way without breaking
+ *    backwards compatibility of the 1.x {@code DynaBeanMapDecorator} class: A
+ *    map wrapping a {@code DynaBean} should be of type {@code Map<String, 
Object>}.
+ *    However, when using these generic parameters in {@code 
DynaBeanMapDecorator}
+ *    this would be an incompatible change (as method signatures would have to
+ *    be adapted). To solve this problem, this generic base class is added
+ *    which allows specifying the key type as parameter. This makes it easy to
+ *    have a new subclass using the correct generic parameters while
+ *    {@code DynaBeanMapDecorator} could still remain with compatible
+ *    parameters.</p>
+ *
+ * @param <K> the type of the keys in the decorated map
+ * @since BeanUtils 1.9.0
+ */
+public abstract class BaseDynaBeanMapDecorator<K> implements Map<K, Object> {
+
+    private final DynaBean dynaBean;
+    private final boolean readOnly;
+    private transient Set<K> keySet;
+
+    // ------------------- Constructors ----------------------------------
+
+    /**
+     * Constructs a read only Map for the specified
+     * {@link DynaBean}.
+     *
+     * @param dynaBean The dyna bean being decorated
+     * @throws IllegalArgumentException if the {@link DynaBean} is null.
+     */
+    public BaseDynaBeanMapDecorator(final DynaBean dynaBean) {
+        this(dynaBean, true);
+    }
+
+    /**
+     * Construct a Map for the specified {@link DynaBean}.
+     *
+     * @param dynaBean The dyna bean being decorated
+     * @param readOnly <code>true</code> if the Map is read only
+     * otherwise <code>false</code>
+     * @throws IllegalArgumentException if the {@link DynaBean} is null.
+     */
+    public BaseDynaBeanMapDecorator(final DynaBean dynaBean, final boolean 
readOnly) {
+        if (dynaBean == null) {
+            throw new IllegalArgumentException("DynaBean is null");
+        }
+        this.dynaBean = dynaBean;
+        this.readOnly = readOnly;
+    }
+
+
+    // ------------------- public Methods --------------------------------
+
+
+    /**
+     * Indicate whether the Map is read only.
+     *
+     * @return <code>true</code> if the Map is read only,
+     * otherwise <code>false</code>.
+     */
+    public boolean isReadOnly() {
+        return readOnly;
+    }
+
+    // ------------------- java.util.Map Methods -------------------------
+
+    /**
+     * clear() operation is not supported.
+     *
+     * @throws UnsupportedOperationException This operation is not yet 
supported
+     */
+    @Override
+    public void clear() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Indicate whether the {@link DynaBean} contains a specified
+     * value for one (or more) of its properties.
+     *
+     * @param key The {@link DynaBean}'s property name
+     * @return <code>true</code> if one of the {@link DynaBean}'s
+     * properties contains a specified value.
+     */
+    @Override
+    public boolean containsKey(final Object key) {
+        final DynaClass dynaClass = getDynaBean().getDynaClass();
+        final DynaProperty dynaProperty = 
dynaClass.getDynaProperty(toString(key));
+        return dynaProperty == null ? false : true;
+    }
+
+    /**
+     * Indicates whether the decorated {@link DynaBean} contains
+     * a specified value.
+     *
+     * @param value The value to check for.
+     * @return <code>true</code> if one of the the {@link DynaBean}'s
+     * properties contains the specified value, otherwise
+     * <code>false</code>.
+     */
+    @Override
+    public boolean containsValue(final Object value) {
+        final DynaProperty[] properties = getDynaProperties();
+        for (final DynaProperty propertie : properties) {
+            final String key = propertie.getName();
+            final Object prop = getDynaBean().get(key);
+            if (value == null) {
+                if (prop == null) {
+                    return true;
+                }
+            } else {
+                if (value.equals(prop)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * <p>Returns the Set of the property/value mappings
+     * in the decorated {@link DynaBean}.</p>
+     *
+     * <p>Each element in the Set is a <code>Map.Entry</code>
+     * type.</p>
+     *
+     * @return An unmodifiable set of the DynaBean
+     * property name/value pairs
+     */
+    @Override
+    public Set<Map.Entry<K, Object>> entrySet() {
+        final DynaProperty[] properties = getDynaProperties();
+        final Set<Map.Entry<K, Object>> set = new HashSet<>(properties.length);
+        for (final DynaProperty propertie : properties) {
+            final K key = convertKey(propertie.getName());
+            final Object value = getDynaBean().get(propertie.getName());
+            set.add(new MapEntry<>(key, value));
+        }
+        return Collections.unmodifiableSet(set);
+    }
+
+    /**
+     * Return the value for the specified key from
+     * the decorated {@link DynaBean}.
+     *
+     * @param key The {@link DynaBean}'s property name
+     * @return The value for the specified property.
+     */
+    @Override
+    public Object get(final Object key) {
+        return getDynaBean().get(toString(key));
+    }
+
+    /**
+     * Indicate whether the decorated {@link DynaBean} has
+     * any properties.
+     *
+     * @return <code>true</code> if the {@link DynaBean} has
+     * no properties, otherwise <code>false</code>.
+     */
+    @Override
+    public boolean isEmpty() {
+        return getDynaProperties().length == 0;
+    }
+
+    /**
+     * <p>Returns the Set of the property
+     * names in the decorated {@link DynaBean}.</p>
+     *
+     * <p><b>N.B.</b>For {@link DynaBean}s whose associated {@link DynaClass}
+     * is a {@link MutableDynaClass} a new Set is created every
+     * time, otherwise the Set is created only once and cached.</p>
+     *
+     * @return An unmodifiable set of the {@link DynaBean}s
+     * property names.
+     */
+    @Override
+    public Set<K> keySet() {
+        if (keySet != null) {
+            return keySet;
+        }
+
+        // Create a Set of the keys
+        final DynaProperty[] properties = getDynaProperties();
+        Set<K> set = new HashSet<>(properties.length);
+        for (final DynaProperty propertie : properties) {
+            set.add(convertKey(propertie.getName()));
+        }
+        set = Collections.unmodifiableSet(set);
+
+        // Cache the keySet if Not a MutableDynaClass
+        final DynaClass dynaClass = getDynaBean().getDynaClass();
+        if (!(dynaClass instanceof MutableDynaClass)) {
+            keySet = set;
+        }
+
+        return set;
+
+    }
+
+    /**
+     * Set the value for the specified property in
+     * the decorated {@link DynaBean}.
+     *
+     * @param key The {@link DynaBean}'s property name
+     * @param value The value for the specified property.
+     * @return The previous property's value.
+     * @throws UnsupportedOperationException if
+     * <code>isReadOnly()</code> is true.
+     */
+    @Override
+    public Object put(final K key, final Object value) {
+        if (isReadOnly()) {
+            throw new UnsupportedOperationException("Map is read only");
+        }
+        final String property = toString(key);
+        final Object previous = getDynaBean().get(property);
+        getDynaBean().set(property, value);
+        return previous;
+    }
+
+    /**
+     * Copy the contents of a Map to the decorated {@link DynaBean}.
+     *
+     * @param map The Map of values to copy.
+     * @throws UnsupportedOperationException if
+     * <code>isReadOnly()</code> is true.
+     */
+    @Override
+    public void putAll(final Map<? extends K, ? extends Object> map) {
+        if (isReadOnly()) {
+            throw new UnsupportedOperationException("Map is read only");
+        }
+        for (final Map.Entry<? extends K, ?> e : map.entrySet()) {
+            put(e.getKey(), e.getValue());
+        }
+    }
+
+    /**
+     * remove() operation is not supported.
+     *
+     * @param key The {@link DynaBean}'s property name
+     * @return the value removed
+     * @throws UnsupportedOperationException This operation is not yet 
supported
+     */
+    @Override
+    public Object remove(final Object key) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Returns the number properties in the decorated
+     * {@link DynaBean}.
+     * @return The number of properties.
+     */
+    @Override
+    public int size() {
+        return getDynaProperties().length;
+    }
+
+    /**
+     * Returns the set of property values in the
+     * decorated {@link DynaBean}.
+     *
+     * @return Unmodifiable collection of values.
+     */
+    @Override
+    public Collection<Object> values() {
+        final DynaProperty[] properties = getDynaProperties();
+        final List<Object> values = new ArrayList<>(properties.length);
+        for (final DynaProperty propertie : properties) {
+            final String key = propertie.getName();
+            final Object value = getDynaBean().get(key);
+            values.add(value);
+        }
+        return Collections.unmodifiableList(values);
+    }
+
+    // ------------------- protected Methods -----------------------------
+
+    /**
+     * Provide access to the underlying {@link DynaBean}
+     * this Map decorates.
+     *
+     * @return the decorated {@link DynaBean}.
+     */
+    public DynaBean getDynaBean() {
+        return dynaBean;
+    }
+
+    /**
+     * Converts the name of a property to the key type of this decorator.
+     *
+     * @param propertyName the name of a property
+     * @return the converted key to be used in the decorated map
+     */
+    protected abstract K convertKey(String propertyName);
+
+    // ------------------- private Methods -------------------------------
+
+    /**
+     * Convenience method to retrieve the {@link DynaProperty}s
+     * for this {@link DynaClass}.
+     *
+     * @return The an array of the {@link DynaProperty}s.
+     */
+    private DynaProperty[] getDynaProperties() {
+        return getDynaBean().getDynaClass().getDynaProperties();
+    }
+
+    /**
+     * Convenience method to convert an Object
+     * to a String.
+     *
+     * @param obj The Object to convert
+     * @return String representation of the object
+     */
+    private String toString(final Object obj) {
+        return obj == null ? null : obj.toString();
+    }
+
+    /**
+     * Map.Entry implementation.
+     */
+    private static class MapEntry<K> implements Map.Entry<K, Object> {
+        
+        private final K key;
+        private final Object value;
+        
+        MapEntry(final K key, final Object value) {
+            this.key = key;
+            this.value = value;
+        }
+        
+        @Override
+        public boolean equals(final Object o) {
+            if (!(o instanceof Map.Entry)) {
+                return false;
+            }
+            final Map.Entry<?, ?> e = (Map.Entry<?, ?>)o;
+            return key.equals(e.getKey()) &&
+                    (value == null ? e.getValue() == null
+                                   : value.equals(e.getValue()));
+        }
+        
+        @Override
+        public int hashCode() {
+            return key.hashCode() + (value == null ? 0 : value.hashCode());
+        }
+        
+        @Override
+        public K getKey() {
+            return key;
+        }
+        
+        @Override
+        public Object getValue() {
+            return value;
+        }
+        
+        @Override
+        public Object setValue(final Object value) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+}

Reply via email to