001: package com.sun.portal.desktop.util;
002:
003: import java.util.Map;
004: import java.util.HashMap;
005: import java.util.Set;
006: import java.util.Collection;
007:
008: /**
009: * This class is a thread-aware smart-modification map.
010: */
011:
012: public class SmartMap implements Map {
013: private Map originalMap = null;
014: private ThreadLocal mapCopies = new ThreadLocal();
015:
016: private SmartMap() {
017: // nothing
018: }
019:
020: public SmartMap(Map m) {
021: originalMap = m;
022: }
023:
024: protected void copyIfNecessary() {
025: Map m = getCopiedMap();
026: if (m == null) {
027: m = new HashMap(originalMap);
028: mapCopies.set(m);
029: }
030: }
031:
032: protected Map getCopiedMap() {
033: Map m = (Map) mapCopies.get();
034: return m;
035: }
036:
037: public Map getMap() {
038: Map m = getCopiedMap();
039: if (m == null) {
040: m = originalMap;
041: }
042:
043: return m;
044: }
045:
046: public void revert() {
047: mapCopies.set(null);
048: }
049:
050: public void evolve() {
051: originalMap = getMap();
052: }
053:
054: public boolean isCopied() {
055: if (getCopiedMap() == null) {
056: return false;
057: } else {
058: return true;
059: }
060: }
061:
062: public Map cloneOriginalMap() {
063: return new HashMap(originalMap);
064: }
065:
066: public void clear() {
067: copyIfNecessary();
068: getMap().clear();
069: }
070:
071: public boolean containsKey(Object key) {
072: return getMap().containsKey(key);
073: }
074:
075: public boolean containsValue(Object val) {
076: return getMap().containsValue(val);
077: }
078:
079: public Set entrySet() {
080: return getMap().entrySet();
081: }
082:
083: public Object get(Object key) {
084: return getMap().get(key);
085: }
086:
087: public int hashCode() {
088: return getMap().hashCode();
089: }
090:
091: public boolean isEmpty() {
092: return getMap().isEmpty();
093: }
094:
095: public Set keySet() {
096: return getMap().keySet();
097: }
098:
099: public Object put(Object key, Object val) {
100: copyIfNecessary();
101: return getMap().put(key, val);
102: }
103:
104: public void putAll(Map t) {
105: copyIfNecessary();
106: getMap().putAll(t);
107: }
108:
109: public Object remove(Object key) {
110: copyIfNecessary();
111: return getMap().remove(key);
112: }
113:
114: public int size() {
115: return getMap().size();
116: }
117:
118: public Collection values() {
119: return getMap().values();
120: }
121:
122: public String toString() {
123: String s = getMap().toString();
124: if (getCopiedMap() != null) {
125: String id = Thread.currentThread().getName();
126: s += " (copied, id=" + id + ")";
127: } else {
128: s += " (original)";
129: }
130:
131: return s;
132: }
133: }
|