Implement copy-on-write of the wrapped map.

This commit is contained in:
hns 2003-07-30 17:00:52 +00:00
parent fad3f06b5c
commit 4a72e955ac

View file

@ -19,6 +19,7 @@ package helma.util;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
/** /**
* A Map that wraps another map and can be set to read-only. * 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? // is this map readonly?
boolean readonly = false; 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 * Constructor
*/ */
@ -42,6 +49,18 @@ public class WrappedMap implements Map {
wrapped = 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 * Set the readonly flag on or off
*/ */
@ -56,6 +75,20 @@ public class WrappedMap implements Map {
return readonly; 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 - // Methods from interface java.util.Map -
// these are just proxies to the wrapped map, except for // these are just proxies to the wrapped map, except for
// readonly checks on modifiers. // readonly checks on modifiers.
@ -86,6 +119,10 @@ public class WrappedMap implements Map {
if (readonly) { if (readonly) {
throw new RuntimeException("Attempt to modify readonly map"); throw new RuntimeException("Attempt to modify readonly map");
} }
if (copyOnWrite) {
wrapped = new HashMap (wrapped);
copyOnWrite = false;
}
return wrapped.put(key, value); return wrapped.put(key, value);
} }
@ -93,6 +130,10 @@ public class WrappedMap implements Map {
if (readonly) { if (readonly) {
throw new RuntimeException("Attempt to modify readonly map"); throw new RuntimeException("Attempt to modify readonly map");
} }
if (copyOnWrite) {
wrapped = new HashMap (wrapped);
copyOnWrite = false;
}
return wrapped.remove(key); return wrapped.remove(key);
} }
@ -100,6 +141,10 @@ public class WrappedMap implements Map {
if (readonly) { if (readonly) {
throw new RuntimeException("Attempt to modify readonly map"); throw new RuntimeException("Attempt to modify readonly map");
} }
if (copyOnWrite) {
wrapped = new HashMap (wrapped);
copyOnWrite = false;
}
wrapped.putAll(t); wrapped.putAll(t);
} }
@ -107,6 +152,10 @@ public class WrappedMap implements Map {
if (readonly) { if (readonly) {
throw new RuntimeException("Attempt to modify readonly map"); throw new RuntimeException("Attempt to modify readonly map");
} }
if (copyOnWrite) {
wrapped = new HashMap (wrapped);
copyOnWrite = false;
}
wrapped.clear(); wrapped.clear();
} }