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

org.apache.felix.framework.util.StringMap Maven / Gradle / Ivy

There is a newer version: 8.1.2
Show newest version
/*
 * 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.felix.framework.util;

import java.util.*;

/**
 * Simple utility class that creates a map for string-based keys.
 * This map can be set to use case-sensitive or case-insensitive
 * comparison when searching for the key.  Any keys put into this
 * map will be converted to a String using the
 * toString() method, since it is only intended to
 * compare strings.
 **/
public class StringMap extends AbstractMap
{
    private static final CharArrayComparator COMPARATOR = new CharArrayComparator();

    private final TreeMap m_map = new TreeMap(COMPARATOR);

    public StringMap()
    {
    }

    public StringMap(Map map)
    {
        for (Map.Entry e : map.entrySet())
        {
            KeyValueEntry kve = (KeyValueEntry) m_map.put(
                toUpperCase(e.getKey().toString()),
                new KeyValueEntry(e.getKey().toString(), e.getValue()));
        }
    }

    @Override
    public int size()
    {
        return m_map.size();
    }

    @Override
    public boolean isEmpty()
    {
        return m_map.isEmpty();
    }

    @Override
    public boolean containsKey(Object arg0)
    {
        return m_map.containsKey(toUpperCase(arg0.toString()));
    }

    @Override
    public boolean containsValue(Object arg0)
    {
        return m_map.containsValue(arg0);
    }

    @Override
    public Object get(Object arg0)
    {
        KeyValueEntry kve = m_map.get(toUpperCase(arg0.toString()));
        return (kve != null) ? kve.value : null;
    }

    @Override
    public Object put(String key, Object value)
    {
        KeyValueEntry kve = (KeyValueEntry) m_map.put(toUpperCase(key), new KeyValueEntry(key, value));
        return (kve != null) ? kve.value : null;
    }

    @Override
    public void putAll(Map map)
    {
        for (Map.Entry e : map.entrySet())
        {
            put(e.getKey().toString(), e.getValue());
        }
    }

    @Override
    public Object remove(Object arg0)
    {
        KeyValueEntry kve = m_map.remove(toUpperCase(arg0.toString()));
        return (kve != null) ? kve.value : null;
    }

    @Override
    public void clear()
    {
        m_map.clear();
    }

    public Set> entrySet()
    {
        return new AbstractSet>()
        {
            @Override
            public Iterator> iterator()
            {
                return new Iterator>()
                {
                    Iterator> it = m_map.entrySet().iterator();

                    public boolean hasNext()
                    {
                        return it.hasNext();
                    }

                    public Entry next()
                    {
                        return it.next().getValue();
                    }

                    public void remove()
                    {
                        throw new UnsupportedOperationException();
                    }
                };
            }

            @Override
            public int size()
            {
                return m_map.size();
            }
        };
    }

    private static char[] toUpperCase(String str)
    {
        char[] ch = str.toCharArray();
        for (int i = 0; i < ch.length; i++)
        {
            char c = ch[i];
            if (c < 128)
            {
                if ('a' <= c && c <= 'z')
                {
                    ch[i] = (char)(c - ('a' - 'A'));
                }
            }
            else
            {
                ch[i] = Character.toUpperCase(c);
            }
        }
        return ch;
    }

    private static class CharArrayComparator implements Comparator
    {
        public int compare(char[] v1, char[] v2)
        {
            int len1 = v1.length;
            int len2 = v2.length;
            int n = Math.min(len1, len2);
            int k = 0;
            while (k < n)
            {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2)
                {
                    return c1 - c2;
                }
                k++;
            }
            return len1 - len2;
        }
    }

    private static class KeyValueEntry implements Map.Entry
    {
        private KeyValueEntry(String key, Object value)
        {
            this.key = key;
            this.value = value;
        }

        public String getKey()
        {
            return key;
        }

        public Object getValue()
        {
            return value;
        }

        public Object setValue(Object value)
        {
            Object v = this.value;
            this.value = value;
            return v;
        }
        String key;
        Object value;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy