diff --git a/src/helma/util/WrappedMap.java b/src/helma/util/WrappedMap.java index 113594bc..373a5de7 100644 --- a/src/helma/util/WrappedMap.java +++ b/src/helma/util/WrappedMap.java @@ -19,6 +19,7 @@ package helma.util; import java.util.Map; import java.util.Set; import java.util.Collection; +import java.util.HashMap; /** * A Map that wraps another map and can be set to read-only. @@ -31,6 +32,12 @@ public class WrappedMap implements Map { // is this map readonly? boolean readonly = false; + // isolate changes from the wrapped map? + boolean copyOnWrite = false; + + public final static int READ_ONLY = 1; + public final static int COPY_ON_WRITE = 2; + /** * Constructor */ @@ -42,6 +49,18 @@ public class WrappedMap implements Map { wrapped = map; } + /** + * Constructor + */ + public WrappedMap(Map map, int mode) { + this(map); + if (mode == READ_ONLY) { + readonly = true; + } else if (mode == COPY_ON_WRITE) { + copyOnWrite = true; + } + } + /** * Set the readonly flag on or off */ @@ -56,6 +75,20 @@ public class WrappedMap implements Map { return readonly; } + /** + * Set the copyOnWrite flag on or off + */ + public void setCopyOnWrite(boolean cow) { + copyOnWrite = cow; + } + + /** + * Is this map copyOnWrite? + */ + public boolean isCopyOnWrite() { + return copyOnWrite; + } + // Methods from interface java.util.Map - // these are just proxies to the wrapped map, except for // readonly checks on modifiers. @@ -86,6 +119,10 @@ public class WrappedMap implements Map { if (readonly) { throw new RuntimeException("Attempt to modify readonly map"); } + if (copyOnWrite) { + wrapped = new HashMap (wrapped); + copyOnWrite = false; + } return wrapped.put(key, value); } @@ -93,6 +130,10 @@ public class WrappedMap implements Map { if (readonly) { throw new RuntimeException("Attempt to modify readonly map"); } + if (copyOnWrite) { + wrapped = new HashMap (wrapped); + copyOnWrite = false; + } return wrapped.remove(key); } @@ -100,6 +141,10 @@ public class WrappedMap implements Map { if (readonly) { throw new RuntimeException("Attempt to modify readonly map"); } + if (copyOnWrite) { + wrapped = new HashMap (wrapped); + copyOnWrite = false; + } wrapped.putAll(t); } @@ -107,6 +152,10 @@ public class WrappedMap implements Map { if (readonly) { throw new RuntimeException("Attempt to modify readonly map"); } + if (copyOnWrite) { + wrapped = new HashMap (wrapped); + copyOnWrite = false; + } wrapped.clear(); }