[prev in list] [next in list] [prev in thread] [next in thread] 

List:       jibx-cvs
Subject:    [Jibx-cvs] core/build/src/org/jibx/util ChainedMap.java,NONE,1.1
From:       Dennis Sosnoski <dsosnoski () users ! sourceforge ! net>
Date:       2009-04-16 11:31:43
Message-ID: E1LuPol-0003CD-Bu () fdv4jf1 ! ch3 ! sourceforge ! com
[Download RAW message or body]

Update of /cvsroot/jibx/core/build/src/org/jibx/util
In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv12277/src/org/jibx/util

Added Files:
	ChainedMap.java 
Log Message:
Added class for chaining maps, with default values from earlier maps in chain \
overridden by later ones.

--- NEW FILE: ChainedMap.java ---
/*
 * Copyright (c) 2009, Dennis M. Sosnoski. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, \
                are permitted provided that the
 * following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list \
                of conditions and the following
 * disclaimer. 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. Neither the name of
 * JiBX nor the names of its contributors may be used to endorse or promote products \
                derived from this software without
 * specific prior written permission.
 * 
 * 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 OWNER 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 org.jibx.util;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Partial implementation of {@link java.util.Map} which provides a merged view of a \
                defaults map with an overrides map.
 * Although this can be used as a map for most purposes, methods which return live \
                views of the keys or values in the
 * map only take into account the overrides, not the defaults.
 */
public class ChainedMap implements Map
{
    /** Default values map. */
    private final Map m_defaults;
    
    /** Override values map. */
    private final Map m_overrides;
    
    /**
     * Constructor.
     * 
     * @param defaults map providing defaults for keys not set directly
     */
    public ChainedMap(Map defaults) {
        m_defaults = defaults;
        m_overrides = new HashMap();
    }
    
    /**
     * Clear all override key-value pairs. This only effects the overrides, not the \
                defaults.
     */
    public void clear() {
        m_defaults.clear();
    }

    /**
     * Check if a key has a defined value. This will return <code>true</code> if the \
                key is present in the overrides map
     * with a non-null value, or if the key is not present in the overrides map but \
                is present in the defaults map.
     *
     * @param key
     * @return <code>true</code> if key defined, <code>false</code> if not
     */
    public boolean containsKey(Object key) {
        if (m_overrides.containsKey(key)) {
            return m_overrides.get(key) != null;
        } else {
            return m_defaults.containsKey(key);
        }
    }

    /**
     * Check if a value is present. This only checks for the value in the overrides \
                map.
     *
     * @param value
     * @return <code>true</code> if value present as an override, <code>false</code> \
                if not
     */
    public boolean containsValue(Object value) {
        return m_overrides.containsValue(value);
    }

    /**
     * Get the set of entries. This only returns the entries in the overrides map.
     *
     * @return override entries
     */
    public Set entrySet() {
        return m_overrides.entrySet();
    }

    /**
     * Get value for key. If the key is present in the overrides map, the value from \
                that map is returned; otherwise,
     * the value for the key in the defaults map is returned.
     *
     * @param key
     * @return value (<code>null</code> if key not present)
     */
    public Object get(Object key) {
        if (m_overrides.containsKey(key)) {
            return m_overrides.get(key);
        } else {
            return m_defaults.get(key);
        }
    }

    /**
     * Check if no overrides are defined.
     *
     * @return <code>true</code> if no overrides, <code>false</code> if any present
     */
    public boolean isEmpty() {
        return m_overrides.isEmpty();
    }

    /**
     * Get the set of keys. This only returns the keys in the overrides map.
     *
     * @return keys
     */
    public Set keySet() {
        return m_overrides.keySet();
    }

    /**
     * Set an override value. This just adds the key-value pair to the override map.
     *
     * @param key
     * @param value
     * @return previous value for key (from default map, if not present in overrides)
     */
    public Object put(Object key, Object value) {
        Object prior;
        if (m_overrides.containsKey(key)) {
            prior = m_overrides.put(key, value);
        } else {
            m_overrides.put(key, value);
            prior = m_defaults.get(key);
        }
        return prior;
    }

    /**
     * Add all key-value pairs from another map into the overrides map.
     *
     * @param map
     */
    public void putAll(Map map) {
        m_overrides.putAll(map);
    }

    /**
     * Remove a key-value pair. If the key was previously present in the overrides \
                map it is simply removed from that
     * map. If it was not present in the overrides map but is present in the defaults \
                map, a null entry is added to the
     * overrides map for that key.
     *
     * @param key
     * @return previous value for key
     */
    public Object remove(Object key) {
        if (m_overrides.containsKey(key)) {
            return m_overrides.remove(key);
        } else {
            return m_defaults.remove(key);
        }
    }

    /**
     * Get the number of entries in the map. This returns the entry count for the \
                overrides map only.
     *
     * @return entry count
     */
    public int size() {
        return m_overrides.size();
    }

    /**
     * Get the values. This returns only the values in the overrides map.
     *
     * @return values
     */
    public Collection values() {
        return m_overrides.values();
    }
}

------------------------------------------------------------------------------
Stay on top of everything new and different, both inside and 
around Java (TM) technology - register by April 22, and save
$200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
300 plus technical and hands-on sessions. Register today. 
Use priority code J9JMT32. http://p.sf.net/sfu/p
_______________________________________________
Jibx-cvs mailing list
Jibx-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jibx-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic