/* Copyright (C) 2004 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.mysql.management.util; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Map which retains the first value a key is set to as a "default" until the * key is removed * * This class is final simply as a hint to the compiler, it may be un-finalized * safely. * * @author Eric Herman <eric@mysql.com> * @version $Id: DefaultsMap.java,v 1.2 2007-04-22 09:57:53 nambar Exp $ */ @SuppressWarnings({ "rawtypes", "unchecked" }) public final class DefaultsMap implements Map { private Map changed; private Map original; private Equals equals; public DefaultsMap() { this.original = new LinkedHashMap(); this.changed = new LinkedHashMap(); this.equals = new Equals(); } public Map getChanged() { return new HashMap(changed); } public Object getDefault(Object key) { return original.get(key); } @Override public void clear() { changed.clear(); original.clear(); } @Override public boolean containsKey(Object key) { return original.containsKey(key); } @Override public boolean containsValue(Object value) { for (Iterator iter = keySet().iterator(); iter.hasNext();) { Object val = get(iter.next()); if (value == null) { if (val == null) { return true; } } else { if (value.equals(val)) { return true; } } } return false; } @Override public Set entrySet() { Set entries = new LinkedHashSet(); for (Iterator iter = keySet().iterator(); iter.hasNext();) { Object key = iter.next(); entries.add(new MapEntry(key, get(key))); } return entries; } @Override public Object get(Object key) { if (changed.containsKey(key)) { return changed.get(key); } return original.get(key); } @Override public boolean isEmpty() { return original.size() == 0; } @Override public Set keySet() { return original.keySet(); } @Override public Object put(Object key, Object value) { if (!original.containsKey(key)) { return original.put(key, value); } Object originalVal = original.get(key); if (!equals.nullSafe(originalVal, value)) { return changed.put(key, value); } if (changed.containsKey(key)) { return changed.remove(key); } return original.put(key, value); } @Override public void putAll(Map t) { for (Iterator iter = t.entrySet().iterator(); iter.hasNext();) { Map.Entry entry = (Map.Entry) iter.next(); put(entry.getKey(), entry.getValue()); } } @Override public Object remove(Object key) { Object oldVal = original.remove(key); if (changed.containsKey(key)) { return changed.remove(key); } return oldVal; } @Override public int size() { return original.size(); } @Override public Collection values() { List values = new ArrayList(original.size()); for (Iterator iter = keySet().iterator(); iter.hasNext();) { values.add(get(iter.next())); } return values; } }