/**
* Copyright (C) 2004 Orbeon, Inc.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation; either version
* 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.util;
import java.util.*;
/**
* Generic class to present a Map view of an attribute-based API.
*/
public abstract class AttributesToMap<E> implements Map<String, E> {
private Attributeable<E> attributeable;
public interface Attributeable<E> {
E getAttribute(String key);
Enumeration<String> getAttributeNames();
void removeAttribute(String key);
void setAttribute(String key, E value);
}
public AttributesToMap(Attributeable<E> attributeable) {
this.attributeable = attributeable;
}
public E put(String key, E value) {
final E existing = attributeable.getAttribute(key);
attributeable.setAttribute(key, value);
return existing;
}
public void clear() {
for (Enumeration<String> e = attributeable.getAttributeNames(); e.hasMoreElements();) {
final String name = e.nextElement();
attributeable.removeAttribute(name);
}
}
public boolean containsKey(Object key) {
return attributeable.getAttribute((String) key) != null;
}
public boolean containsValue(Object value) {
for (Enumeration<String> e = attributeable.getAttributeNames(); e.hasMoreElements();) {
final String name = e.nextElement();
final Object o = get(name);
if (o == value)
return true;
}
return false;
}
public Set<Map.Entry<String, E>> entrySet() {
final HashSet<Map.Entry<String, E>> result = new HashSet<Map.Entry<String, E>>();
for (final String name : Collections.list(attributeable.getAttributeNames())) {
result.add(new Map.Entry<String, E>() {
public String getKey() { return name; }
public E getValue() { return attributeable.getAttribute(name); }
public E setValue(E value) {
final E previousValue = getValue();
attributeable.setAttribute(name, value);
return previousValue;
}
});
}
return result;
}
public E get(Object key) {
return attributeable.getAttribute((String) key);
}
public boolean isEmpty() {
return size() == 0;
}
public Set<String> keySet() {
// FIXME: Changes to the Set must be reflected in the Map. For now return an immutable Map.
return Collections.unmodifiableSet(new HashSet<String>(Collections.list(attributeable.getAttributeNames())));
}
public void putAll(Map<? extends String, ? extends E> t) {
for (String key: t.keySet()) {
put(key, t.get((String) key));
}
}
public E remove(Object key) {
final E existing = attributeable.getAttribute((String) key);
attributeable.removeAttribute((String) key);
return existing;
}
public int size() {
return keySet().size();
}
public Collection<E> values() {
// FIXME: Changes to the Set must be reflected in the Map. For now return an immutable Map.
List<E> results = new ArrayList<E>();
for (Enumeration<String> e = attributeable.getAttributeNames(); e.hasMoreElements();) {
final String name = e.nextElement();
results.add(get(name));
}
return Collections.unmodifiableCollection(results);
}
}