package org.sothis.mvc.http.servlet; import java.util.Enumeration; import java.util.Iterator; import java.util.Map.Entry; import org.sothis.mvc.Attributes; public abstract class ServletAttributes implements Attributes { protected abstract Enumeration<String> getAttributeNames(); @Override public Iterator<Entry<String, Object>> iterator() { return new AttributeIterator(getAttributeNames()); } @Override public Iterator<String> names() { return new NamesIterator(getAttributeNames()); } private class NamesIterator implements Iterator<String> { Enumeration<String> names; String current; public NamesIterator(Enumeration<String> names) { this.names = names; } @Override public boolean hasNext() { return names.hasMoreElements(); } @Override public String next() { current = names.nextElement(); return current; } @Override public void remove() { ServletAttributes.this.remove(current); } } private class AttributeIterator implements Iterator<Entry<String, Object>> { Enumeration<String> names; String current; public AttributeIterator(Enumeration<String> names) { this.names = names; } @Override public boolean hasNext() { return names.hasMoreElements(); } @Override public Entry<String, Object> next() { current = names.nextElement(); return new AttributeEntry(current); } @Override public void remove() { ServletAttributes.this.remove(current); } } private class AttributeEntry implements Entry<String, Object> { private final String name; private Object value; public AttributeEntry(String name) { super(); this.name = name; } @Override public String getKey() { return name; } @Override public Object getValue() { if (null == value) { value = get(name); } return value; } @Override public Object setValue(Object value) { Object old = this.value; set(name, value); this.value = value; return old; } } }