package nus.font; import java.awt.font.TextAttribute; import java.util.AbstractMap; import java.util.HashMap; import java.util.Map; import java.util.Set; public final class AttributeMap extends AbstractMap<TextAttribute, Object> { private AttributeValues values; private Map<TextAttribute, Object> delegateMap; public AttributeMap(AttributeValues values) { this.values = values; } public Set<Entry<TextAttribute, Object>> entrySet() { return delegate().entrySet(); } public Object put(TextAttribute key, Object value) { return delegate().put(key, value); } // internal API public AttributeValues getValues() { return values; } private static boolean first = false; // debug private Map<TextAttribute, Object> delegate() { if (delegateMap == null) { if (first) { first = false; Thread.dumpStack(); } delegateMap = values.toMap(new HashMap<TextAttribute, Object>(27)); // nuke values, once map is accessible it might be mutated and values would // no longer reflect its contents values = null; } return delegateMap; } public String toString() { if (values != null) { return "map of " + values.toString(); } return super.toString(); } }