All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jodd.util.collection.StringKeyedMapAdapter Maven / Gradle / Ivy

Go to download

Web Data Extractor - Extract data from common web format. like HTML,XML,JSON.

The newest version!
// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

package jodd.util.collection;

import java.util.AbstractMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Adapter for map whose keys are String values.
 */
public abstract class StringKeyedMapAdapter extends AbstractMap {

    // ---------------------------------------------------------------- hooks

    /**
     * Hooks method that needs to be implemented by concrete subclasses.
     * Gets a value associated with a key.
     */
    protected abstract Object getAttribute(String key);

    /**
     * Hooks method that needs to be implemented by concrete subclasses.
     * Puts a key-value pair in the map, overwriting
     * any possible earlier value associated with the same key.
     */
    protected abstract void setAttribute(String key, Object value);

    /**
     * Hooks method that needs to be implemented by concrete subclasses.
     * Removes a key and its associated value from the
     * map.
     */
    protected abstract void removeAttribute(String key);

    /**
     * Hook method that needs to be implemented by concrete subclasses.
     * Returns an enumeration listing all keys known to the map.
     */
    protected abstract Iterator getAttributeNames();

    // ---------------------------------------------------------------- implementation

    private Set> entries;     // cached entries

    /**
     * Removes all attributes from the request as well as clears entries in this map.
     */
    @Override
    public void clear() {
        entries = null;
        Iterator keys = getAttributeNames();
        while (keys.hasNext()) {
            removeAttribute(keys.next());
        }
    }

    /**
     * Returns a Set of attributes from the http request.
     */
    @Override
    public Set> entrySet() {
        if (entries == null) {
            entries = new HashSet<>();
            Iterator iterator = getAttributeNames();
            while (iterator.hasNext()) {
                final String key = iterator.next();
                final Object value = getAttribute(key);
                entries.add(new Entry() {
                    @Override
                    public boolean equals(Object obj) {
                        Entry entry = (Entry) obj;
                        return ((key == null) ? (entry.getKey() == null) : key.equals(entry.getKey())) && ((value == null) ? (entry.getValue() == null) : value.equals(entry.getValue()));
                    }

                    @Override
                    public int hashCode() {
                        return ((key == null) ? 0 : key.hashCode()) ^ ((value == null) ? 0 : value.hashCode());
                    }

                    public String getKey() {
                        return key;
                    }

                    public Object getValue() {
                        return value;
                    }

                    public Object setValue(Object obj) {
                        setAttribute(key, obj);
                        return value;
                    }
                });
            }
        }

        return entries;
    }

    /**
     * Returns the request attribute associated with the given key or null if it doesn't exist.
     */
    @Override
    public Object get(Object key) {
        return getAttribute(key.toString());
    }

    /**
     * Saves an attribute in the request.
     */
    @Override
    public Object put(String key, Object value) {
        entries = null;
        Object previous = get(key);
        setAttribute(key, value);
        return previous;
    }

    /**
     * Removes the specified request attribute.
     */
    @Override
    public Object remove(Object key) {
        entries = null;
        Object value = get(key);
        removeAttribute(key.toString());
        return value;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy